将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。
输入格式:
输入的第一行给出一个正整数N(≤20),随后一行给出N个不同的整数,其间以空格分隔。
输出格式:
在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。
输入样例1:
5
88 70 61 96 120
输出样例1:
70
输入样例2:
7
88 70 61 96 120 90 65
输出样例2:
88
本题重点在于平衡二叉树的调整。首先平衡二叉树是一种特殊的二叉排序树,即满足左结点的值小于根结点,右孩子的值大于根结点。所以进行插入所进行的调整都是为了能够满足二叉排序树的特点。
有四种情况RR,LL,RL,LR。其实LR就是先将二叉树以插入节点进行L旋转变成RR型;RL道理类似。
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeN* Tree;
struct TreeN
{
int data;
Tree left;
Tree right;
};
int getheight(Tree s)
{
int m =0, n = 0;
if (!s)
return 0;
m = getheight(s->left);
n = getheight(s->right);
if (m >= n)
return m + 1;
else
return n + 1;
}
Tree LL(Tree k1)
{
Tree k2 = k1->left;
k1->left = k2->right;
k2->right = k1;
return k2;
}
Tree RR(Tree k1)
{
Tree k2 = k1->right;
k1->right = k2->left;
k2->left = k1;
return k2;
}
Tree LR(Tree k3)
{
k3->left = RR(k3->left);
return (LL(k3));
}
Tree RL(Tree k3)
{
k3->right = LL(k3->right);
return (RR(k3));
}
Tree insert(Tree l, int data)
{
if (l==NULL)
{
l = (Tree)malloc(sizeof(Tree));
l->data = data;
l->left = NULL;
l->right = NULL;
}
else
{
if (data > l->data)
{
l->right=insert(l->right, data);
if (getheight(l->left) - getheight(l->right) == -2)
{
if (l->right->data > data)
l = RL(l);
else
l = RR(l);
}
}
else if (data < l->data)
{
l->left = insert(l->left, data);
if (getheight(l->left) - getheight(l->right) == 2)
{
if (l->left->data > data)
l = LL(l);
else
l = LR(l);
}
}
}
return l;
}
int main()
{
int n;
int data;
Tree A = NULL;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &data);
A = insert(A, data);
}
printf("%d", A->data);
}