04-樹5 Root of AVL Tree (25 分)
阿新 • • 發佈:2018-11-21
#include<cstdio> #include<stdlib.h> typedef struct TNode* Tree; struct TNode{ int data; Tree Left, Right; }; int Height(Tree T){ if(T){ int HL=Height(T->Left); int HR=Height(T->Right); int MAX=HL>HR?HL:HR; return MAX+1; } return 0; } Tree LLFix(Tree T){ Tree root=T->Left; T->Left=root->Right; root->Right=T; return root; } Tree LRFix(Tree T){ Tree root=T->Left->Right; T->Left->Right=root->Left; root->Left=T->Left; T->Left=root->Right; root->Right=T; return root; } Tree RRFix(Tree T){ Tree root=T->Right; T->Right=root->Left; root->Left=T; return root; } Tree RLFix(Tree T){ Tree root=T->Right->Left; T->Right->Left=root->Right; root->Right=T->Right; T->Right=root->Left; root->Left=T; return root; } Tree Insert(Tree T, int num){ if(!T){ T=(Tree)malloc(sizeof(struct TNode)); T->data=num; T->Left=T->Right=NULL; }else{ if(num > T->data){ T->Right=Insert(T->Right, num); if(Height(T->Left)-Height(T->Right)==-2){ if(num > T->Right->data){//RR T=RRFix(T); }else{//RL T=RLFix(T); } } }else if(num < T->data){ T->Left=Insert(T->Left, num); if(Height(T->Left)-Height(T->Right)==2){ if(num > T->Left->data){//LR T=LRFix(T); }else{//LL T=LLFix(T); } } } } return T; } int main(){ int n, num; Tree T=NULL; scanf("%d", &n); for(int i=0; i<n; i++){ scanf("%d", &num); T=Insert(T, num); } if(T)printf("%d", T->data); return 0; }