其他分享
首页 > 其他分享> > 平衡二叉树的根

平衡二叉树的根

作者:互联网

这应该是一道典型考察的平衡二叉树的操作的题目。

 

---------------------------------------------------------------------------------------------------------

 

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

--------------------------------------------------------------------------------

虽然简单可是我还是不会,不过在做题中提升了自我,加油,干饭人!



 

标签:Right,return,int,AVLTree,GetHeight,二叉树,平衡,Left
来源: https://www.cnblogs.com/Code--Monkey/p/15682863.html