Вращение Splay дерева в C
Я реализовал несколько функций для поворота узла в расширенном дереве, но это каким-то образом разрушает мое дерево, отправляя один и тот же узел в разные места. Они поворачивают сына к узлу папы. Указатель папы, вероятно, избыточен, но я хотел попробовать этот способ. Я использую их в функции для настройки узла на корень.
struct cliente *rot_left(struct cliente *a){
if(a==root){
return a;
}
struct cliente *tmp=NULL,*tmp1=NULL;
tmp = a->dad;
tmp1 = tmp->dad;
a->dad= tmp->dad; //removes dad, point to grandpa
tmp->dad = a; //tmp point a
tmp->right = a->left; //a left to tmp right
a->left = tmp; //a picks son tmp
if(tmp1!=NULL){
if(tmp1->right==tmp)
tmp1->right=a;
else
tmp1->left=a;}
return a;}
struct cliente *rot_right(struct cliente *a){
if(a==root){
return a;
}
struct cliente *tmp=NULL,*tmp1=NULL;
tmp = a->dad;
tmp1 = tmp->dad;
a->dad = tmp->dad;
tmp->dad= a;
tmp->left = a->right;
a->right= tmp;
if(tmp1!=NULL){
if(tmp1->right==tmp)
tmp1->right=a;
else
tmp1->left=a;}
return a;
}
void adjust(struct cliente *a){
while(a->dad !=NULL) {
if(a==(a->dad->right)){
a=rot_left(a);
} else
a=rot_right(a);
}
root=a;
}