链接:
题意:
求依次插入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;
}