Вращение 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;
}

0 ответов

Другие вопросы по тегам