1066 Root of AVL Tree

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

70

Sample Input 2:

7
88 70 61 96 120 90 65

Sample Output 2:

88

思路

构建二叉平衡树即可。我直接用了以前的模板。。要全部记下来还是优点不容易。。

AC代码

#include <cstdio>
#include <iostream>
using namespace std;

typedef struct node{
	int data, height;
	node *lchild, *rchild;
}*BTree, BNode;

//创建新结点 
node* newNode(int v){
	BNode* Node = new node;
	Node->data = v;
	Node->height = 1;//初始树高为1 
	Node->lchild = NULL;
	Node->rchild = NULL;
	return Node;
}
//获取该根结点高度 
int getHeight(BTree &BT){
	if(BT == NULL) return 0;
	return BT->height;
}
//计算结点平衡因子 
int getBalanceFactor(BNode* &Node){
	//等于左子树高度-右子树高度 
	return getHeight(Node->lchild) - getHeight(Node->rchild); 
} 
//更新结点高度 
int updateHeight(BNode* &Node){
	Node->height = max(getHeight(Node->lchild),getHeight(Node->rchild)) + 1;
} 
//左旋 
void L(BTree &BT){
	BNode* temp = BT->rchild;
	BT->rchild = temp->lchild;
	temp->lchild = BT;
	updateHeight(BT); 
	updateHeight(temp);
	BT = temp;
} 
//右旋 
void R(BTree &BT){
	BNode* temp = BT->lchild;
	BT->lchild = temp->rchild;
	temp->rchild = BT;
	updateHeight(BT);
	updateHeight(temp);
	BT = temp;
} 
//插入新结点 
void insert(BNode* &Node, int v){
	if(Node == NULL){
		Node = newNode(v);
		return;
	}
	if(v < Node->data){
		insert(Node->lchild, v);
		updateHeight(Node); //更新该子树高度 
		if(getBalanceFactor(Node) == 2){ //失衡  
			if(getBalanceFactor(Node->lchild) == 1) //LL型
				R(Node);
			else if(getBalanceFactor(Node->lchild) == -1){ //LR型
				L(Node->lchild);
				R(Node); 
			} 
		}
	}
	else{
		insert(Node->rchild, v);
		updateHeight(Node); //更新该子树高度
		if(getBalanceFactor(Node) == -2){ //失衡 
			if(getBalanceFactor(Node->rchild) == -1) //RR型
				L(Node);
			else if(getBalanceFactor(Node->rchild) == 1){ //RL型
				R(Node->rchild);
				L(Node); 
			} 
		}
	}
}

BTree create(int data[], int n){
	BTree BT = NULL;
	for(int i = 0; i < n; i++)
		insert(BT, data[i]);
	return BT;
}

int main(){ 
	int n, data[20];
	cin>>n;
	for(int i = 0; i < n; i++)
		cin>>data[i];
	BTree BT = create(data, n);
	cout<<BT->data; 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值