这应该是一道典型考察的平衡二叉树的操作的题目。
---------------------------------------------------------------------------------------------------------
练习4.2 平衡二叉树的根 (25 分)
将给定的一系列数字插入初始为空的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
--------------------------------------------------------------------------------------
接下来是开始解题思路,
好吧好像也没什么解题思路,这不是很明显是就课本上的代码吗。
#include <stdio.h>
#include <stdlib.h>
typedef struct AVLNode *Position;
typedef Position AVLTree;
struct AVLNode{
int Data;
AVLTree Left;
AVLTree Right;
int Height;
};
int Max(int a,int b)
{
return (a>b? a:b);
}
int GetHeight(AVLTree T)
{
if(!T)
{
return 0;
}
return Max(GetHeight(T->Left),GetHeight(T->Right))+1;
}
AVLTree SignleLeftRotation(AVLTree A)
{
// A必须有一个左子结点
//A和B做左单旋
AVLTree B = A->Left;
A->Left = B->Right;
B->Right = A;
A->Height = Max(GetHeight (A->Left),GetHeight(A->Right))+1;
B->Height = Max(GetHeight (B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree SignleRightRotation(AVLTree A)
{
//A必须有一个右子结点
//A和B做右单旋
AVLTree B = A->Right;
A->Right = B->Left;
B->Left = A;
A->Height = Max(GetHeight (A->Left),GetHeight(A->Right))+1;
B->Height = Max(GetHeight (B->Left),GetHeight(B->Right))+1;
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree A)
{
//A必须有左结点B,且B必须有右结点
//A,B与C做两次单旋,返回C
A->Left = SignleRightRotation(A->Left);
return SignleLeftRotation(A);
}
AVLTree DoubleRightLeftRotaion(AVLTree A)
{
A->Right = SignleLeftRotation(A->Right);
return SignleRightRotation(A);
}
AVLTree Insert(AVLTree T,int x)
{
if(!T)
{
T = (AVLTree)malloc(sizeof(struct AVLNode));
T->Data = x;
T->Height = 1;
T->Left = T->Right = NULL;
}
else if(x<T->Data)
{
T->Left = Insert(T->Left,x);
if((GetHeight(T->Left)-GetHeight(T->Right))==2)
if(x<T->Left->Data)
T = SignleLeftRotation(T);
else
T = DoubleLeftRightRotation(T);
}
else if(x>T->Data)
{
T->Right = Insert(T->Right,x);
if(GetHeight(T->Left)-GetHeight(T->Right)==-2)
{
if(x>T->Right->Data)
T = SignleRightRotation(T);
else
T = DoubleRightLeftRotaion(T);
}
}
T->Height = Max(GetHeight(T->Left),GetHeight(T->Right))+1;
return T;
}
int main(void)
{
AVLTree T = NULL;
int N,x;
scanf("%d",&N);
while(N--)
{
scanf("%d",&x);
T = Insert(T,x);
}
printf("%d",T->Data);
return 0;
}
--------------------------------------------------------------------------------
虽然简单可是我还是不会,不过在做题中提升了自我,加油,干饭人!