PAT1066 Root of AVL Tree 平衡二叉树的实现

链接:

PAT1066

题意:

求依次插入N个带权节点的平衡二叉树最后的根节点的权是多少

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct node{
    int data;
    node *left,*right;
    int h;
}*AVLtree;
int max(int a,int b){
    return a>b?a:b;
}
int Get_h(AVLtree T){
    if(!T)
        return 0;
    else
        return T->h;
}

AVLtree SingleLeftRotation(AVLtree A){        //向右旋
    AVLtree B=A->left;
    A->left=B->right;
    B->right=A;
    A->h=max(Get_h(A->left),Get_h(A->right))+1;
    B->h=max(Get_h(B->left),Get_h(B->right))+1;
    return B;
}

AVLtree SingleRightRotation(AVLtree A){       //向左旋
    AVLtree B=A->right;
    A->right=B->left;
    B->left=A;
    A->h=max(Get_h(A->left),Get_h(A->right))+1;
    B->h=max(Get_h(B->left),Get_h(B->right))+1;
    return B;
}

AVLtree DoubleLeftRightRotation(AVLtree A){   //左节点左旋再整体右旋
    A->left=SingleRightRotation(A->left);
    return SingleLeftRotation(A);
}

AVLtree DoubleRightLeftRotation(AVLtree A){   //右节点右旋再整体左旋
    A->right=SingleLeftRotation(A->right);
    return SingleRightRotation(A);
}

AVLtree AVLTree_insert(AVLtree T,int x){
    if(!T){
        T=(AVLtree)malloc(sizeof(node));
        T->data=x;
        T->left=T->right=NULL;
        T->h=1;                               //新节点的初始高度为1
        return T;
    }else if(x<T->data){
        T->left=AVLTree_insert(T->left,x);
        if(Get_h(T->left)-Get_h(T->right)==2){
            if(x<T->left->data)                        //插在左节点的左边(右旋)
                T=SingleLeftRotation(T);
            else                                        //插在左节点的右边(左旋右旋)
                T=DoubleLeftRightRotation(T);
        }
    }else{
        T->right=AVLTree_insert(T->right,x);
        if(Get_h(T->left)-Get_h(T->right)==-2){
            if(x>T->right->data)                      //插在右节点的右边(左旋)
                T=SingleRightRotation(T);
            else
                T=DoubleRightLeftRotation(T);          //插在右节点的左边(右旋左旋)
        }
    }
    T->h=max(Get_h(T->left),Get_h(T->right))+1;           //更新高度
    return T;
}
int main(){
    int n,x;
    AVLtree T=NULL;
    scanf("%d",&n);
    while(n--){
        scanf("%d",&x);
        T=AVLTree_insert(T,x);
    }
    cout<<T->data<<endl;
    return 0;
}

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/axuan_k/article/details/45175207
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注