1066 Root of AVL Tree [重要 待分析 天勤] 算法下P325 平衡二叉树

//1066 Root of AVL Tree [重要 待分析  天勤] 算法下P325 平衡二叉树
#include <iostream>
using namespace std;
typedef struct BTNode{
    int data;
    struct BTNode *lChild,*rChild;
}BTNode;//C C++ 通用定义方式

BTNode* rotateL(BTNode *root){
    BTNode *t = root->rChild;
    root->rChild = t->lChild;
    t->lChild = root;
    return t;
}

BTNode* rotateR(BTNode *root){
    BTNode *t = root->lChild;
    root->lChild = t->rChild;
    t->rChild = root;
    return t;
}

BTNode *rotateLR(BTNode *root){
    root->lChild = rotateL(root->lChild);
    return rotateR(root);
}
BTNode* rotateRL(BTNode *root){
    root->rChild = rotateR(root->rChild);
    return rotateL(root);
}
int getHeight(BTNode *root){
    if(root == NULL) return 0;
    return max(getHeight(root->lChild),getHeight(root->rChild))+1;
}

void insert(BTNode *&root,int data){
    if(root == NULL){
        root = new BTNode();
        root->data = data;
        root->lChild = root->rChild = NULL;
    }else if(data < root->data){
        insert(root->lChild,data);
        if(getHeight(root->lChild) - getHeight(root->rChild) == 2){
            root = data < root->lChild->data ? rotateR(root) : rotateLR(root);
        }
    }else{ //相等的情况呢??
        insert(root->rChild,data);
        if(getHeight(root->lChild) - getHeight(root->rChild) == -2){
            root = data > root->rChild->data ? rotateL(root) : rotateRL(root);
        }
    }
}


int main(){
    int N,data;
    cin>>N;
    BTNode *root = NULL;
    for(int i=0;i<N;++i){
        cin>>data;
        insert(root,data);
    }
    cout<<root->data;
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务