04-树5 Root of AVL Tree
平衡二叉树
LL RR LR RL 注意画图理解法


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 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
//平衡二叉树 AVL
#include <stdio.h>
#include <stdlib.h> typedef int ElementType; typedef struct AVLNode *Position;
typedef Position AVLTree; /* AVL树类型 */
typedef struct AVLNode{
ElementType data; /* 结点数据 */
AVLTree left; /* 指向左子树 */
AVLTree right; /* 指向右子树 */
int height; /* 树高 */
}; int Max ( int a, int b )
{
return a > b ? a : b;
} int GetHeight( Position p )
{
if(!p)
return -;
return p->height;
} /* 将A与B做左单旋,更新A与B的高度,返回新的根结点B */
/* 注意:A必须有一个左子结点B */
AVLTree SingleLeftRotation ( AVLTree A )
{
AVLTree B = A->left;
A->left = B->right;
B->right = A;
A->height = Max( GetHeight(A->left), GetHeight(A->right) ) + ;
B->height = Max( GetHeight(B->left), A->height ) + ; return B;
}
/* 将A与B做右单旋,更新A与B的高度,返回新的根结点B */
/* 注意:A必须有一个右子结点B */
AVLTree SingleRightRotation ( AVLTree A )
{
AVLTree B = A->right;
A->right = B->left;
B->left = A;
A->height = Max( GetHeight(A->left), GetHeight(A->right) ) + ;
B->height = Max( A->height, GetHeight(B->right) ) + ; return B;
} /* 注意:A必须有一个左子结点B,且B必须有一个右子结点C */
/* 将A、B与C做两次单旋,返回新的根结点C */
AVLTree DoubleLeftRightRotation ( AVLTree A )
{
/* 将B与C做右单旋,C被返回 */
A->left = SingleRightRotation(A->left);
/* 将A与C做左单旋,C被返回 */
return SingleLeftRotation(A);
} /* 将A、B与C做两次单旋,返回新的根结点C */
/* 注意:A必须有一个右子结点B,且B必须有一个左子结点C */
AVLTree DoubleRightLeftRotation ( AVLTree A )
{
/* 将B与C做右单旋,C被返回 */
A->right = SingleLeftRotation(A->right);
/* 将A与C做左单旋,C被返回 */
return SingleRightRotation(A);
} /* 将X插入AVL树T中,并且返回调整后的AVL树 */
AVLTree Insert( AVLTree T, ElementType X )
{
if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */
T = (AVLTree)malloc(sizeof(struct AVLNode));
T->data = X;
T->height = ;
T->left = T->right = NULL;
} /* if (插入空树) 结束 */ else if ( X < T->data ) {
T->left = Insert( T->left, X);/* 插入T的左子树 */
if ( GetHeight(T->left)-GetHeight(T->right) == ) /* 如果需要左旋 */
if ( X < T->left->data )
T = SingleLeftRotation(T); //左单旋 LL
else
T = DoubleLeftRightRotation(T); //左-右双旋LR
} /* else if (插入左子树) 结束 */ else if ( X > T->data ) {
T->right = Insert( T->right, X );/* 插入T的右子树 */
if ( GetHeight(T->left)-GetHeight(T->right) == - )/* 如果需要右旋 */
if ( X > T->right->data )
T = SingleRightRotation(T); //右单旋 RR
else
T = DoubleRightLeftRotation(T); //右-左双旋 RL
} /* else if (插入右子树) 结束 */ /*else X == T->Data,无须插入 */
T->height = Max( GetHeight(T->left), GetHeight(T->right) ) + ; //更新树高 return T;
} int main()
{
int N, data;
AVLTree T;
scanf("%d",&N);
for(int i = ; i < N; i++) {
scanf("%d",&data);
T = Insert(T,data);
}
printf("%d\n",T->data);
return ;
}
04-树5 Root of AVL Tree的更多相关文章
- 04-树5 Root of AVL Tree + AVL树操作集
平衡二叉树-课程视频 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the tw ...
- PAT 1066 Root of AVL Tree[AVL树][难]
1066 Root of AVL Tree (25)(25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, ...
- PTA (Advanced Level) 1066 Root of AVL Tree
Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of ...
- PAT甲级1066. Root of AVL Tree
PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...
- 04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- pat04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- pat 甲级 1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- PTA 04-树5 Root of AVL Tree (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/668 5-6 Root of AVL Tree (25分) An AVL tree ...
- PAT_A1066#Root of AVL Tree
Source: PAT A1066 Root of AVL Tree (25 分) Description: An AVL tree is a self-balancing binary search ...
- PAT-1066(Root of AVL Tree)Java语言实现
Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...
随机推荐
- Mplayer 官方中文手册
MPlayer 名称总览描述交互式控制用法配置文件配置集通用选项播放器选项(仅适用于MPLAYER)分离器/媒体流选项OSD/字幕选项音频输出选项(仅适用于MPLAYER)音频输出驱动(仅适用于MPL ...
- 一个关于发邮件的类,可以模拟发送对smtp服务器或者是本地文件夹
namespace SportsStore.Domain.Concrete { public class EmailSettings { public string MailToAddress = & ...
- leetcode reverse bits python
Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (re ...
- 转——Android测试之monkey
一.为什么要用Monkey 测试? 简单在说就是象猴子一样乱点,为了测试软件的稳定性,健壮性.号称最快速有效的方法.有时候运行相同系列的测试,即使是复杂的测试,但是以相同的顺序和路径,即使一遍又一 ...
- Creating Icon Overlay Handlers / 创建图标标记 Handlers (翻译自MSDN) / VC++, Windows, DLL, ATL, COM
创建图标标记 Handlers Creating Icon Overlay Handlers 图标标记是放在代表着某个 Shell 对象的图标之左下角的小图像.它们通常被加在一个对象的图标的身上来提供 ...
- Android开发-API指南-<supports-gl-texture>
<supports-gl-texture> 英文原文:http://developer.android.com/guide/topics/manifest/supports-gl-text ...
- Android开发-API指南-系统权限
System Permissions 英文原文:http://developer.android.com/guide/topics/security/permissions.html 采集日期:201 ...
- 【LeetCode】14. Longest Common Prefix 最长前缀子串
题目: Write a function to find the longest common prefix string amongst an array of strings. 思路:求最长前缀子 ...
- sql server数据库中 smallint, int ,bigint ,tinyint的区别与长度
smallint 是一种精确的数值数据类型,其精度在算术运算后不变,采用2个字节编码 有符号的 smallint 值的范围是 -2^15-------2^15 -1,即 -32768 ----327 ...
- Winserver2008R2 .netframework4.5 asp.netmvc 访问出现的是文件列表。
Winserver2008R2 .netframework4.5 asp.netmvc 访问出现的是文件列表,服务器需要安装如下的补丁,才可正常访问. http://www.microsoft.com ...