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.* ...
随机推荐
- Oracle Profile 使用详解--zhuanzai
一.目的: Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制,使用Create Profile命令创建一个Profile,用它来实现对数据库资源的限制使用,如果把该prof ...
- Hibernate——主键配置
<id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现. Increment:由hibernate自动递增生成标识符 ...
- 项目积累——jQuery
初始化时为文本框赋值,聚焦后清空内容 $(function(){ $("#buyDate").val("格式:2014-01-01"); $("#bu ...
- OC基础(9)
OC中的私有方法 @property基本概念 @synthesize基本概念 @property增强 @property修饰符 *:first-child { margin-top: 0 !impor ...
- Windows操作 - Photoshop为图片添加透明立体水印
原文地址:http://design.yesky.com/photoshop/252/2427752.shtml 本文我们介绍用Photoshop为图片添加透明立体水印的方法和技巧. 原图: 打开原图 ...
- 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(二)
之前简单的介绍了如何使用RF,在这一节里,主要介绍下Selenium2Library的API, 在线的地址是http://robotframework.org/Selenium2Library/Sel ...
- Appium移动自动化测试(四)--先跑起来再说(第一个测试用例-手机YY)
说明 本文将详细说明如何使用Appnium完成:打开手机YY欢迎页面->按住屏幕向左滑动4次->按下"立即体验"按钮->按下"直播"按钮,的整 ...
- cocos2d-x 3.x丨搭建Android环境下的开发环境
所需要的一些工具软件: 1.JDK 官网下载地址:http://www.oracle.com/ttechnetwork/java/javase/downloads/index.html 2.Andr ...
- mysql创建远程用户
grant all privileges on *.* to myuser@"%" identified by 'password'; 用root用户登陆,然后: grant al ...
- 【转】最实用的IT类网站及工具大集合
转自:http://www.cnblogs.com/annie00/p/5753507.html 1.聚合数据 大家在开发过程中,可能会用到各种各样的数据,想找一些接口来提供一些数据.比如天气预报查询 ...