04-树5 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

这题主要是实现平衡二叉树,还不清楚如何构建的小伙伴可以看这里
树的数据结构

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef struct TreeNode *Tree;
struct TreeNode {
	int value;
	Tree left,right;
	//int height;
};
int GetHeightMax(int left ,int right){
	return left > right ? left:right;
}
int getHeight(Tree tree){
	if(tree == nullptr){
		return 0;
	}
	if(tree->left == NULL && tree->right == NULL){
		return 1;
	}
	if(tree->left != nullptr && tree->right == nullptr){
		return getHeight(tree->left) + 1; 
	}
	if(tree->right != nullptr && tree->left == nullptr){
		return getHeight(tree->right) + 1;
	}
	return GetHeightMax(getHeight(tree->left),getHeight(tree->right)) + 1;
}
//左单旋
Tree leftRotate(Tree tree){
	Tree newTree = tree->left;
	tree->left = newTree->right;
	newTree->right = tree;
	//tree->height = getHeight(tree) + 1;

	return newTree;
}
//左右双旋
Tree leftrightRotate(Tree tree){
	Tree newTree = tree->left->right;
	tree->left->right = newTree->left;
	newTree->left = tree->left;
	tree->left = newTree->right;
	newTree->right = tree;
	//tree->height = getHeight(tree) + 1;
	return newTree;
}
//右单旋
Tree rightRotate(Tree tree){
	Tree newTree = tree->right;
	tree->right = newTree->left;
	newTree->left = tree;
	//tree->height = getHeight(tree) + 1;

	return newTree;
}
Tree rightleftRotate(Tree tree){
	Tree newTree = tree->right->left;
	tree->right->left = newTree->right;
	newTree->right = tree->right;
	tree->right = newTree->left;
	newTree->left = tree;
	return newTree;

}
//插入数据
Tree insert(Tree tree,int value){
	if(tree == nullptr){
		tree = new TreeNode;
		tree->value = value;
		//tree->height = 0;
		tree->left = nullptr;
		tree->right = nullptr;
		return tree;
	}
	//1、小于于结点值,放在左边
	if(value < tree->value){
		tree->left = insert(tree->left ,value);
		//如果左子树高度-右子树高度=2,则需要旋转
		if(getHeight(tree->left) - getHeight(tree->right) == 2){
			//发生旋转
			//值小于左节点的左值 左单旋
			if(value < tree->left->value){
				tree = leftRotate(tree);
			}else{//左右双旋
				tree = leftrightRotate(tree);
			}
		}
	}else if(value > tree->value){
		tree->right = insert(tree->right , value);
		//如果右子树高度-左子树高度=2,则需要旋转
		if(getHeight(tree->right) - getHeight(tree->left) == 2){
			//发生旋转
			//值大于左节点的左值 右单旋
			if(value > tree->right->value){
				tree = rightRotate(tree);
			}else{
				tree = rightleftRotate(tree);
			}
		}
	}
	//tree->height = GetHeightMax(getHeight(tree->left),getHeight(tree->right)) + 1;
	return tree;
}
int main(int argc, char *argv[])
{	
	int num , value;
	//1、读入结点个数
	cin >> num;
	Tree tree = nullptr;
	for(int i = 0;i < num;i++){
		cin >> value;
		tree = insert(tree,value);
	}
	cout << tree->value << endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值