[drzewa] operacje na wskaźnikach

0

Witam, mam pewien problem dotyczący operacji na drzewach (dokladnie rotacji). Chodzi o wskaźnik do wskaźnika.
załóżmy ze mam strukturę:

struct node {
	int val,b;
	node* l,*r,*p;
}*root=NULL;

i napisałem funkcje rotującą w prawo lecz jako parametr dostaje wskaźnik do wskaźnika:

void right_rotation(node*& tmp) {
	if (tmp) {
		node* oldTmp=tmp;
		tmp=tmp->l;  // !!!!!!! tu nie dziala, nie wiem czemu !
		oldTmp->l = tmp->r;
		tmp->r=oldTmp;
	}
}

wiem ze nie ustalam wskaźnika PARENT ale nie w tym problem.
fragment

		tmp=tmp->l;

powinien dla takiej sytuacji(przekazuje wskaznik na 21):
4

21
/
6 28
ustawic wskaznik RIGHT z czwórki NA SZÓSTKĘ.
4

6

zrobilem funkcje drukujace drzewo przed ww. fragmentem i po -> nic takiego nie ma miejsca....,drukuje w kółko to samo drzewo, a po wyjsciu z funkcji drzewo ma wyciety wskaznik na 6 (zapewne dlatego ze reszta kodu z ten funkcji go wycina) ale dlaczego kod tmp=tmp->l nie odnosi efektu ??
ktos pomoze ?
dziękuję

0

Rozwiazalem problem.
Byl on w wywołaniu funkcji, po prostu przekazywalem do niej ZNALEZIONY (treeSearch) wskaznik na ten (21) element, nie byl on powiazany z drzewewm. Zauważyłem to przekazując funkcji POINTER->PARENT->CHILD.
zapewnia to ze wskaznik przekazany jest na pewno częscia drzewa.
Ponadto wszelkie rady na ten temat chętnie bym usłyszał.
Dziękuję

0

Oj chyba za bardzo sobie to chciałeś uprościć ;)

//kod dla struktury:
struct node
{
node* left;
node* right;
node* parent;
int val;
};

void rotate_r(node*& refptr)
{
  node* ptr = refptr; //kopia wskaźnika, na wypadek gdyby to był root

  if (ptr && ptr->left) //czy rotacja jest w ogóle mozliwa
    {
      if (ptr->parent) //nie-root, zmieniamy wskazanie parenta elementu rotowanego
        {
          if (ptr->parent->left == ptr) //nasz element jest lewym poddrzewem
            ptr->parent->left = ptr->left;
          else //lub prawym
            ptr->parent->right = ptr->left;
        }
      else //rotujemy roota
        refptr=ptr->left; //zmiana na wskazania na roota

      ptr->left->parent=ptr->parent;
      ptr->parent=ptr->left;
      ptr->left=ptr->parent->right;
      if (ptr->left) //jeśli przepięliśmy prawe poddrzewo nowego ojca to ustawiamy mu dobrego parenta
        ptr->left->parent=ptr;
      ptr->parent->right=ptr;
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1