慕课浙大数据结构-04-树5 Root of AVL Tree (25分)

忘记参考哪个博客写的了哎
错误://以下这两个函数不知道怎么写出来的,总是错,其实就还是想不太清楚,右左旋 左右旋 搞不清楚

pTree RLrotate(pTree p){
    
    
    p->Right = LLrotate(p->Right);
    return RRrotate(p);
}
pTree LRrotate(pTree p){
    
    
    p->Left = RRrotate(p->Left);
    return LLrotate(p);
}

错误:指针要初始化才能带入函数

int main(){
    
    
    int n,v;
    pTree p = NULL;//忘记初始化为空了
    cin>>n;
    for(int i=0;i<n;++i){
    
    
        cin>>v;
        p = Insert(p,v);
    }
    cout<<p->Data<<endl;
    return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
typedef struct TreeNode *pTree;//forget the struct
struct TreeNode{
    
    
    int Data;
    pTree Left,Right;
    int height;
    TreeNode(int v):Data(v),Left(NULL),Right(NULL),height(0){
    
    }//forget height(0)
    // TreeNode():Left(NULL),Right(NULL){}
};
int GetHeight(pTree p){
    
    
    if(!p) return -1;
    else return p->height;
}
int Max(int a,int b){
    
    return a>b? a:b;}
pTree LLrotate(pTree p){
    
    
    pTree rl;
    rl = p->Left;
    p->Left = rl->Right;
    rl->Right = p;
    p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
    rl->height = Max(GetHeight(rl->Right),GetHeight(rl->Left))+1;   
    return rl;
}
pTree RRrotate(pTree p){
    
    
    pTree rr;
    rr = p->Right;
    p->Right = rr->Left;
    rr->Left = p;
    p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
    rr->height = Max(GetHeight(rr->Right),GetHeight(rr->Left))+1;
    return rr;
}
//以下这两个函数不知道怎么写出来的,总是错,其实就还是想不太清楚
pTree RLrotate(pTree p){
    
    
    p->Right = LLrotate(p->Right);
    return RRrotate(p);
}
pTree LRrotate(pTree p){
    
    
    p->Left = RRrotate(p->Left);
    return LLrotate(p);
}
bool Balanced(pTree left,pTree right){
    
    
    return abs(GetHeight(left)-GetHeight(right))<2;
}
pTree Insert(pTree p,int v){
    
    
    if(!p){
    
    
        p = new TreeNode(v);//read new relative
        return p;
    }
    if(p->Data>v){
    
    
        p->Left = Insert(p->Left,v);
        if(!Balanced(p->Left,p->Right)){
    
    
            //可是检查树是不是平衡不应该检查每个节点么?
            if(v<p->Left->Data){
    
    
                p = LLrotate(p);
            }
            else{
    
    
                p = LRrotate(p);
            }
        }
    }
    else{
    
    
        //wrong used else(p->Data<v) else后面不能加条件哦
        p->Right = Insert(p->Right,v);
        if(!Balanced(p->Left,p->Right)){
    
    
            if(v>p->Right->Data){
    
    
                p = RRrotate(p);
            }
            else{
    
    
                p = RLrotate(p);
            }
        }
    }
    p->height = Max(GetHeight(p->Right),GetHeight(p->Left))+1;
    return p;
}
int main(){
    
    
    int n,v;
    pTree p = NULL;//忘记初始化为空了
    cin>>n;
    for(int i=0;i<n;++i){
    
    
        cin>>v;
        p = Insert(p,v);
    }
    cout<<p->Data<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43919570/article/details/105285079