witam
mam problem z rotacjami w avl, już 4 dzień nad tym siedzę i nie mogę dojść co jest nie tak
to jest najlepsza wersja jak na razie,
w rotacjach (rr i ll) jeżeli a == 1 wykonywana jest rotacja rl lub lr,
kluczem drzewa jest przede wszystkim pesel przynajmniej jedno pole jest zawsze unikatowe, zatem pesel może się powtarzać i np. imię ale nazwisko musi być wtedy inne
bardzo proszę o pomoc
#include <iostream>
using namespace std;
struct drzewo{
drzewo *parent, *left, *right;
string name,surname;
unsigned int pesel;
int bf;
};
drzewo *rr(drzewo * p,int a){
drzewo *l;
l = p->right;
if(a == 1){
p->right = l->left;
l->left->parent = p;
l->left->right = l;
l->parent = l->left;
l->left = NULL;
}
l = p->right;
l->parent = p->parent;
p->parent->right = l;
l->left = p;
p->parent = l;
p->right = NULL;
return l;
}
drzewo *ll(drzewo *p,int a){
drzewo *l;
l=p->left;
if(a == 1){
p->left = l->right;
l->right->parent = p;
l->right->left = l;
l->parent = l->right;
l->right = NULL;
}
l = p->left;
l->parent = p->parent;
p->parent->left = l;
l->right = p;
p->parent = l;
p->left = NULL;
return l;
}
drzewo * balance(drzewo * l,int dir){ // -1 prawy, 1 lewy
drzewo *p;
p=l->parent;
l->bf=0;
if(dir == 1)l->parent->left=l;
else l->parent->right=l;
if(p->bf != 0)p->bf=0;
//cout << "sciezka: " << endl << endl;
while(p->parent != NULL){
if(p->left == NULL && p->right == NULL)p->bf=0;
if(p->left == NULL){
if(p->right->bf == 0)p->bf=-1;
else p->bf=-2;
}
if(p->right == NULL){
if(p->left->bf == 0) p->bf=1;
else p->bf=2;
}
if(p->left != NULL && p->right != NULL){
if(p->left->bf !=0 && p->right->bf == 0)p->bf+=1;
if(p->right->bf !=0 && p->left->bf == 0)p->bf-=1;
if(p->right->bf !=0 && p->left->bf != 0)p->bf=0;
if(p->right->bf ==0 && p->left->bf == 0)p->bf=0;
}
cout << "jestem " << p->pesel << " moj bf=" << p->bf << " synowie: ";
if(p->left != NULL)cout << p->left->pesel << " ";;
if(p->right != NULL)cout << p->right->pesel;
cout << endl;
if(p->bf == -2){
//cout << "rotacja rr!!!" << endl;
if(p->right->bf == -1) {rr(p,0);break;}
else {rr(p,1);break;}
}
else if(p->bf == 2){
//cout << "rotacja ll!!!" << endl;
if(p->left->bf == 1) {ll(p,0);break;}
else {ll(p,1);break;}
}
p=p->parent; //przesuwamy wskaznik
}
}