1066Root of AVL Tree(25分)
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 integerN(≤20) which is the total number of keys to be inserted. ThenNdistinct 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
思路
- 构建一个平衡二叉树,并输出根节点的值。
- 本题代码较长,尤其注意
insert()
函数的编写。
代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 25;
struct node
{
int data, height;
node* lchild, *rchild;
};
int n;
int data[maxn];
node* newNode(int v)
{
node* Node = new node;
Node -> data = v;
Node -> height = 1;
Node -> lchild = Node -> rchild = NULL;
return Node;
}
int getHeight(node* root)
{
if (root == NULL)
return 0;
return root -> height;
}
int getBalanceFactor(node* root)
{
return getHeight(root -> lchild) - getHeight(root -> rchild);
}
void updateHeight(node* root)
{
root -> height = max(getHeight(root -> lchild), getHeight(root -> rchild)) + 1;
}
//左旋
void leftRotation(node* &root)
{
node* temp = root -> rchild;
root -> rchild = temp -> lchild;
temp -> lchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
//右旋
void rightRotation(node* &root)
{
node* temp = root -> lchild;
root -> lchild = temp -> rchild;
temp -> rchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
//插入操作
void insert(node* &root, int v)
{
if (root == NULL)
{
root = newNode(v);
return;
}
if (v < root -> data)
{
insert(root -> lchild, v);
updateHeight(root);
if (getBalanceFactor(root) == 2)
{
if (getBalanceFactor(root -> lchild) == 1)
{
rightRotation(root);
}
else if (getBalanceFactor(root -> lchild) == -1)
{
leftRotation(root -> lchild);
rightRotation(root);
}
}
}
else
{
insert(root -> rchild, v);
updateHeight(root);
if(getBalanceFactor(root) == -2)
{
if (getBalanceFactor(root -> rchild) == -1)
{
leftRotation(root);
}
else if (getBalanceFactor(root -> rchild) == 1)
{
rightRotation(root -> rchild);
leftRotation(root);
}
}
}
}
node* create(int data[], int n)
{
node* root = NULL;
for (int i = 0; i < n; i ++)
{
insert(root, data[i]);
}
return root;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++)
{
scanf("%d", &data[i]);
}
node* root = create(data, n);
printf("%d\n", root -> data);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。