pat04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25)
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 ythe 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
平衡二叉树的建立、插入、更新。
- #include<cstdio>
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<queue>
- #include<vector>
- using namespace std;
- int num;
- struct node{
- int v,h;
- node *l,*r;
- node(){
- l=r=NULL;
- h=;
- }
- };
- int max(int a,int b){
- if(a>b){
- return a;
- }
- else{
- return b;
- }
- }
- int GetHigh(node *h){
- if(!h){
- return ;
- }
- return h->h;
- }
- void LeftRotation(node *&h){
- node *p=h->l;
- h->l=p->r;
- p->r=h;
- h=p;
- h->r->h=max(GetHigh(h->r->l),GetHigh(h->r->r))+;
- h->h=max(GetHigh(h->l),GetHigh(h->r))+;
- }
- void RightRotation(node *&h){
- node *p=h->r;
- h->r=p->l;
- p->l=h;
- h=p;
- h->l->h=max(GetHigh(h->l->l),GetHigh(h->l->r))+;
- h->h=max(GetHigh(h->l),GetHigh(h->r))+;
- }
- void RightLeftRotation(node *&h){
- LeftRotation(h->r);
- //h->h=max(GetHigh(h->l),GetHigh(h->r))+1;
- RightRotation(h);
- }
- void LeftRightRotation(node *&h){
- RightRotation(h->l);
- //h->h=max(GetHigh(h->l),GetHigh(h->r))+1;
- LeftRotation(h);
- }
- void AVLInsert(int v,node *&h){
- if(!h){//已经到了最底层
- h=new node();
- h->v=v;
- return;
- }
- //bool can=false;
- if(v<h->v){
- AVLInsert(v,h->l);
- if(GetHigh(h->l)-GetHigh(h->r)==){
- //can=true;
- if(v<h->l->v){//左单旋
- LeftRotation(h);
- }
- else{//左右双旋
- LeftRightRotation(h);
- }
- }
- }
- else{
- AVLInsert(v,h->r);
- if(GetHigh(h->l)-GetHigh(h->r)==-){
- //can=true;
- if(v>h->r->v){//左单旋
- RightRotation(h);
- }
- else{//左右双旋
- RightLeftRotation(h);
- }
- }
- }
- //if(!can)
- h->h=max(GetHigh(h->l),GetHigh(h->r))+; //更新树高为1或2的树的树高
- }
- /*void prefind(node *h){
- if(h){
- //cout<<11<<endl;
- cout<<h->v<<endl;
- prefind(h->l);
- prefind(h->r);
- }
- }*/
- int main(){
- //freopen("D:\\INPUT.txt","r",stdin);
- int n;
- while(scanf("%d",&n)!=EOF){
- node *h=NULL;
- int i;
- for(i=;i<n;i++){
- scanf("%d",&num);
- AVLInsert(num,h);
- }
- //prefind(h); //检测
- printf("%d\n",h->v);
- }
- return ;
- }
模板:
- typedef struct AVLTreeNode *AVLTree;
- typedef struct AVLTreeNode{
- ElementType Data;
- 4 AVLTree Left;
- AVLTree Right;
- int Height;
- };
- AVLTree AVL_Insertion ( ElementType X, AVLTree T )
- { /* 将 X 插入 AVL 树 T 中,并且返回调整后的 AVL 树 */
- if ( !T ) { /* 若插入空树,则新建包含一个结点的树 */
- T = (AVLTree)malloc(sizeof(struct AVLTreeNode));
- T->Data = X;
- T->Height = ;
- T->Left = T->Right = NULL;
- } /* if (插入空树) 结束 */
- else if (X < T->Data) { /* 插入 T 的左子树 */
- T->Left = AVL_Insertion(X, T->Left);
- if (GetHeight(T->Left) - GetHeight(T->Right) == )
- /* 需要左旋 */
- if (X < T->Left->Data)
- T = SingleLeftRotation(T); /* 左单旋 */
- else
- T = DoubleLeftRightRotation(T); /* 左-右双旋 */
- } /* else if (插入左子树) 结束 */
- else if (X > T->Data) { /* 插入 T 的右子树 */
- T->Right = AVL_Insertion(X, T->Right);
- if (GetHeight(T->Left) - GetHeight(T->Right) == - )
- /* 需要右旋 */
- if (X > T->Right->Data)
- 30 T = SingleRightRotation(T); /* 右单旋 */
- else
- T = DoubleRightLeftRotation(T); /* 右-左双旋 */
- } /* else if (插入右子树) 结束 */
- /* else X == T->Data,无须插入 */
- T->Height = Max(GetHeight(T->Left),GetHeight(T->Right))+;
- /*更新树高*/
- return T;
- }
- AVLTree SingleLeftRotation ( AVLTree A )
- { /* 注意: A 必须有一个左子结点 B */
- /* 将 A 与 B 做如图 4.35 所示的左单旋,更新 A 与 B 的高度,返回新的根结点 B */
- 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;
- }
- AVLTree DoubleLeftRightRotation ( AVLTree A )
- { /* 注意: A 必须有一个左子结点 B,且 B 必须有一个右子结点 C */
- /* 将 A、 B 与 C 做如图 4.38 所示的两次单旋,返回新的根结点 C */
- A->Left = SingleRightRotation(A->Left); /*将 B 与 C 做右单旋, C 被返回*/
- return SingleLeftRotation(A); /*将 A 与 C 做左单旋, C 被返回*/
- }
pat04-树4. Root of AVL Tree (25)的更多相关文章
- 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 ...
- 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甲级:1066 Root of AVL Tree (25分)
PAT甲级:1066 Root of AVL Tree (25分) 题干 An AVL tree is a self-balancing binary search tree. In an AVL t ...
- pat1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- PAT 甲级 1066 Root of AVL Tree (25 分)(快速掌握平衡二叉树的旋转,内含代码和注解)***
1066 Root of AVL Tree (25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, t ...
- 1066 Root of AVL Tree (25分)(AVL树的实现)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
- PAT Advanced 1066 Root of AVL Tree (25) [平衡⼆叉树(AVL树)]
题目 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child ...
- PAT 1066. Root of AVL Tree (25)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...
随机推荐
- 安卓手机传递文件到Windows系统电脑
1.需求说明 安卓手机传递文件到Windows系统电脑上不太方便,传递文件的原理花样太多.这里介绍纯净原生的蓝牙文件传递方式. 2.操作步骤 2.1 打开侧边栏面板 2.2 打开蓝牙,右键转至设置 2 ...
- 1233: 传球游戏 [DP]
1233: 传球游戏 [DP] 时间限制: 1 Sec 内存限制: 128 MB 提交: 4 解决: 3 统计 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做 ...
- Redhat系的Linux系统里,网络主要设置文件简介【转载】
以下是原文地址,转载请指明出处: http://blog.chinaunix.net/uid-26495963-id-3230810.html 一.配置文件详解在RHEL或者CentOS等Redhat ...
- Link cut tree 实现不高效的 LCA
https://www.luogu.org/problemnew/show/P3379 求 a 和 b 的 LCA 考虑先 access(a),此时 a 和 root 在一条链上,再 access(b ...
- 百度编辑器 Ueditor使用记录
Ueditor官网: http://fex.baidu.com/ueditor/#dev-bale_width_grunt UeditorAPI文档: https://ueditor.baidu.co ...
- 基于python-opencv3的图像显示和保存操作
import cv2 as cv import numpy as np #导入库 print("------------------------ ...
- Linux常用的命令(3)
1 文件的内容显示 cat 显示全部 more: 分屏幕显示,只能向后翻 less: 分屏幕显示,可以向上翻 head:查看前n行 默认10行 tail:查看后n行 -n -f: 查看文件尾部,不退出 ...
- Eclipse 使用TFS
Install Soft , –> add http://dl.microsoft.com/eclipse/tfs form:http://msdn.microsoft.com/en-us/ ...
- js 有用信息集
1.java.cookie.js 库:轻易操作cookie 2.jquery.form.js 库:通过ajaxForm,ajaxsubmit 两个函数,将form转为ajax提交方式:https:// ...
- [SDOi2012]Longge的问题 BZOJ2705 数学
题目背景 SDOi2012 题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). ...