平衡二叉树

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的更多相关文章

  1. 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 ...

  2. 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, ...

  3. 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 ...

  4. PAT甲级1066. Root of AVL Tree

    PAT甲级1066. Root of AVL Tree 题意: 构造AVL树,返回root点val. 思路: 了解AVL树的基本性质. AVL树 ac代码: C++ // pat1066.cpp : ...

  5. 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 ...

  6. 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 ...

  7. pat 甲级 1066. Root of AVL Tree (25)

    1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  8. 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 ...

  9. PAT_A1066#Root of AVL Tree

    Source: PAT A1066 Root of AVL Tree (25 分) Description: An AVL tree is a self-balancing binary search ...

  10. PAT-1066(Root of AVL Tree)Java语言实现

    Root of AVL Tree PAT-1066 这是关于AVL即二叉平衡查找树的基本操作,包括旋转和插入 这里的数据结构主要在原来的基础上加上节点的高度信息. import java.util.* ...

随机推荐

  1. mysql 存储结构

    mysql存储结构:数据库->表->数据 1)管理数据库 增:create database sjk; 删:drop database sjk; 改:alter database sjk; ...

  2. 剑指Offer:面试题14——调整数组顺序使奇数位于偶数前面(java实现)

    问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路: 1.最简单的想法,不考虑时间复杂度,扫描数组,遇到偶数,先取出这 ...

  3. python编写接口

  4. 如何在 Git 里撤销(几乎)任何操作

    任何版本控制系统的一个最有的用特性就是“撤销 (undo)”你的错误操作的能力.在 Git 里,“撤销” 蕴含了不少略有差别的功能. 当你进行一次新的提交的时候,Git 会保存你代码库在那个特定时间点 ...

  5. Flex 中文字体终极解决方案

    一直以来Flash对中文的支持就不是很好,很多人都发现很多汉字在Flex中无法设置粗体,就是其中一个表现,经过一晚上的折腾,终于突破了这个难题,其实,答案就在Adobe的官方教程里,只能怪自己英文水平 ...

  6. pb中打开窗口并传递参数

    try long ll_result; ll_result=1;openwithparm(w_sb_order,UserCode);catch(RuntimeError er)  errorMsg=e ...

  7. MongoDB 2: 安装和使用

    导读:上篇博客中简单介绍了MongoDB,本篇文章主要是介绍Mongo的安装和使用(环境为win8).(PS:这是一篇没什么技术含量的文章,仅是个人的笔记式文档)下一篇博客,将介绍Mongo使用过程中 ...

  8. 详解H264视频格式-2016.01.28

    专业名词解释 VCL(Video Coding Layer)视频编码层 NAL(Network Abstraction Layer)网络提取层 SPS(Sequence Parameter Set) ...

  9. WWF3事务和异常处理类型活动<第四篇>

    一.FaultHandler 添加一个工作流图如下: 首先添加一个Seruence,在里面添加3个Code,外面添加一个Code,打开Seruence错误处理,在容器里添加一个faultHandler ...

  10. Solaris引导和关闭

    OpenBoot PROM简称OBP,相当于PC的BIOS,是控制SUN服务器的引导过程.初始化配置某些硬件并提供某些诊断的工具.常见OBP命令 boot boot:从默认设备启动boot -s:从默 ...