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

PAT1066

``````#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
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。