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.* ...
随机推荐
- OC基础(23)
NSArray基本概念 NSArray 遍历 NSArray排序 NSArray文件读写 NSArray 与字符串 *:first-child { margin-top: 0 !important; ...
- 下载和使用 Open XML PowerTools
安装 Open XML SDK 2.5 首先,需要安装 Open XML SDK 2.5 ,从这个地址下载安装程序:http://www.microsoft.com/en-in/download/de ...
- android 如何设置背景的透明度
半透明<Button android:background="#e0000000" ... />透明<Button android:background=&quo ...
- xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题)
xcode7.3 升级 xcode8.0 后权限设置问题(升级xcode 8.0 后构建版本不显示问题) 前两天为了适配 iOS10 的系统 我将xcode 7.3 升级到了 xcode 8.0 但是 ...
- Add, remove, shuffle and sort
To deal cards, we would like a method that removes a card from the deck and returns it. The list met ...
- WebView 获取网页点击事件
网页上的点击按钮 本身绑定了URL,点击的时候webview 会在下面的这个方法中加载URL - (BOOL)webView:(UIWebView*)webView shouldStartLoadWi ...
- [oracle] listener.ora 、sqlnet.ora 、tnsnames.ora
路径 $ORACLE_HOME/network/admin sqlnet.ora(客户及服务器端) 作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个 ...
- JS 在open打开的子窗口页面中调用父窗口页面的JS方法
需求的情景如下: 1:做新增或修改等操作的时候打开一个新的浏览器窗口(使用window.open(参数等)方法) 2:在新增或修改等的页面上有返回按钮.重置按钮.保存按钮,对于返回就直接关闭此窗口(使 ...
- 学习记录 java 链表知识
01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...
- Facebook 的系统架构(转)
来源:http://www.quora.com/What-is-Facebooks-architecture(由Micha?l Figuière回答) 根据我现有的阅读和谈话,我所理解的今天Faceb ...