0

我已经实现了几个函数来旋转展开树中的节点,但它通过将相同的节点发送到不同的地方以某种方式破坏了我的树。他们将儿子旋转到父亲节点。爸爸的指针可能是过度的,但我想尝试这种方式。我在函数中使用那些将节点调整为根。

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;
}
4

0 回答 0