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