1066. Root 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 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 ythe 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树的根结点。数据结构与算法分析-c语言描述书上有分析和源码

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct avlNode *avlTree;
struct avlNode
{
int node;
avlTree left;
avlTree right;
int height;
};
int Height(avlTree p)
{//空树的高度为-1
if(p == NULL)
return -1;
else 
return p->height;
}
avlTree rotateRight(avlTree root)
{//全部在左边,往右旋转
avlNode* leftTree;
leftTree = root->left;
root->left = leftTree->right;
leftTree->right = root;


root->height = max(Height(root->left), Height(root->right)) + 1;
        leftTree->height = max(Height(leftTree->left), root->height) + 1;
return leftTree;
}
avlTree rotateLeft(avlTree root)
{
avlNode* rightTree;
rightTree = root->right;
root->right = rightTree->left;
rightTree->left = root;


root->height = max(Height(root->left), Height(root->right)) + 1;
        rightTree->height = max(Height(rightTree->left), root->height) + 1;
return rightTree;
}
avlTree rotateLeftRight(avlTree root)
{
root->left = rotateLeft(root->left);
return rotateRight(root);
}
avlTree rotateRightLeft(avlTree root)
{
root->right = rotateRight(root->right);
return rotateLeft(root);
}
avlTree insert(int node, avlTree T)
{
if(T == NULL){
T = new avlNode();
if(T == NULL)
printf("out of space!!!");
else {
T->node = node;
T->left = NULL;
T->right = NULL;
T->height = 0;
}
} else if(node < T->node){
T->left = insert(node, T->left);
if(Height(T->left) - Height(T->right) == 2){
if(node < T->left->node)//全部都往左插,进行一次往右的单旋转即可
T = rotateRight(T);
else//一次往左插入,一次往右插入,先进行一次往左的单旋转,一次往右的单旋转
T = rotateLeftRight(T); 
}
}else if(node > T->node){
T->right = insert(node, T->right);
if(Height(T->right) - Height(T->left) == 2){
if(node > T->right->node)//全部都往右边插,进行一次往左的单旋转
T = rotateLeft(T);
else//一次往右插入,一次往左插入,先进行一次往右的单旋转,再进行一次往左的单旋转
T = rotateRightLeft(T);
}
}
T->height = max(Height(T->left), Height(T->right)) + 1;
return T;
}
int main()
{
int n, node;
scanf("%d", &n);
avlTree root = NULL;
for(int i = 0; i < n; i++){
scanf("%d", &node);
root = insert(node, root);
}
printf("%d", root->node);
return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值