1. 程式人生 > >04-樹5 Root of AVL Tree (25 分)

04-樹5 Root of AVL Tree (25 分)

 

#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;
}