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

题意可简要概述为构造一个平衡二叉树(AVL)并且返回其根节点的值。 

我解决此题的方法是照葫芦画瓢。

具体实现如下:

1.构造树结构:

struct treenode
{
	int val;
	tree left;
	tree right;
};

2.递归获取树高:

int GetTreeHeight(tree T)
{
	int H=0, HL=0, HR=0;
	if (!T) return 0;
	else
	{
		HL = GetTreeHeight(T->left);
		HR = GetTreeHeight(T->right);
		H = HL > HR ? HL : HR;
		return H + 1;
	}

}

3.实现LL、LR、RR、RL旋转(这个代码是相互对称的):

tree LLrotation(tree T)
{
	tree  t;
	t = T->left;
	T->left = t->right;
	t->right = T;
	return t;
}

tree LRrotation(tree T)
{
	tree t=T->left->right;
	T->left->right = t->left;
	t->left = T->left;
	T->left = t->right;
	t->right = T;
	return t;
};

tree RRrotation(tree T)
{
	tree t;
	t = T->right;
	T->right = t->left;
	t->left = T;
	return t;
}

tree RLrotation(tree T)
{
	tree t = T->right->left;
	T->right->left = t->right;
	t->right = T->right;
	T->right = t->left;
	t->left = T;
	return t;
}

4.树的插入操作:

tree insert(tree T, int i)
{
	if (!T)
		return NewNode(i);
	if (i > T->val)
	{
		T->right = insert(T->right, i);
		if (GetTreeHeight(T->right) - GetTreeHeight(T->left) == 2)
		{
			if (i > T->right->val)
				T = RRrotation(T);
			else  if (i < T->right->val)
				T = RLrotation(T);
		}
	}
	else if (i < T->val)
	{
		T->left = insert(T->left, i);
		if (GetTreeHeight(T->left) - GetTreeHeight(T->right) == 2)
		{
			if (i>T->left->val)
				T = LRrotation(T);
			else
				T = LLrotation(T);
		}
	}
	return T;
}

整体代码如下:

//avl tree
#include<stdio.h>
#include<stdlib.h>
typedef struct treenode* tree;
struct treenode
{
	int val;
	tree left;
	tree right;
};

tree NewNode(int i);
tree makeTree(int n);
tree insert(tree T, int i);
int GetTreeHeight(tree T);
tree LLrotation(tree T);
tree LRrotation(tree T);
tree RLrotation(tree T);
tree RRrotation(tree T);

int main()
{
	int n;
	scanf("%d", &n);
	tree t = makeTree(n);
	printf("%d", t->val);
	return 0;
}


tree NewNode(int i)
{
	tree t = (tree)malloc(sizeof(struct treenode));
	t->val = i;
	t->left = t->right = NULL;
	return t;
}

tree makeTree(int n)
{
	if (n == 0) return NULL;
	int v;
	scanf("%d",&v);
	tree t = NewNode(v);
	for (int i = 1; i < n; i++)
	{
		scanf("%d", &v);
		t = insert(t,v);
	}
	return t;
}

tree LLrotation(tree T)
{
	tree  t;
	t = T->left;
	T->left = t->right;
	t->right = T;
	return t;
}

tree LRrotation(tree T)
{
	tree t=T->left->right;
	T->left->right = t->left;
	t->left = T->left;
	T->left = t->right;
	t->right = T;
	return t;
};

tree RRrotation(tree T)
{
	tree t;
	t = T->right;
	T->right = t->left;
	t->left = T;
	return t;
}

tree RLrotation(tree T)
{
	tree t = T->right->left;
	T->right->left = t->right;
	t->right = T->right;
	T->right = t->left;
	t->left = T;
	return t;
}

tree insert(tree T, int i)
{
	if (!T)
		return NewNode(i);
	if (i > T->val)
	{
		T->right = insert(T->right, i);
		if (GetTreeHeight(T->right) - GetTreeHeight(T->left) == 2)
		{
			if (i > T->right->val)
				T = RRrotation(T);
			else  if (i < T->right->val)
				T = RLrotation(T);
		}
	}
	else if (i < T->val)
	{
		T->left = insert(T->left, i);
		if (GetTreeHeight(T->left) - GetTreeHeight(T->right) == 2)
		{
			if (i>T->left->val)
				T = LRrotation(T);
			else
				T = LLrotation(T);
		}
	}
	return T;
}

int GetTreeHeight(tree T)
{
	int H=0, HL=0, HR=0;
	if (!T) return 0;
	else
	{
		HL = GetTreeHeight(T->left);
		HR = GetTreeHeight(T->right);
		H = HL > HR ? HL : HR;
		return H + 1;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值