其它pta数据结构编程题请参见:pta

这道题考察平衡二叉查找树的插入。

为了保证二叉查找树的平衡,当一个结点的左右子树的高度差大于1时就要进行调整。

分为以下四种情况:

插入新节点后,以及旋转之后,需要更新结点的高度。

RL旋转可以通过右孩子的LL旋转,然后当前节点的RR旋转实现。

同理,LR旋转可以通过左孩子的RR旋转,然后当前节点的LL旋转实现。

  1 #include <iostream>
  2 using namespace std;
  3
  4 typedef struct Node *Tree;
  5 struct Node
  6 {
  7     int data;
  8     Tree left;
  9     Tree right;
 10     int height;
 11 };
 12
 13 Tree insert(Tree T, int X);
 14 Tree ll(Tree A);
 15 Tree lr(Tree A);
 16 Tree rr(Tree A);
 17 Tree rl(Tree A);
 18 int getHeight(Tree T);
 19 int max(int a, int b);
 20 Tree createNode(int X);
 21
 22 int main()
 23 {
 24     int N, X, i;
 25     cin >> N >> X;
 26     Tree root = createNode(X);
 27     for (i = 1; i < N; i++)
 28     {
 29         cin >> X;
 30         root = insert(root, X);
 31     }
 32     cout << root->data;
 33     return 0;
 34 }
 35
 36 Tree insert(Tree T, int X)
 37 {
 38     if (!T)
 39         T = createNode(X);
 40     else if (X < T->data)
 41     {
 42         T->left = insert(T->left, X);
 43         if (getHeight(T->left) - getHeight(T->right) == 2)
 44         {
 45             if (X < T->left->data)
 46                 T = ll(T);
 47             else
 48                 T = lr(T);
 49         }
 50     }
 51     else if (X > T->data)
 52     {
 53         T->right = insert(T->right, X);
 54         if (getHeight(T->right) - getHeight(T->left) == 2)
 55         {
 56             if (X > T->right->data)
 57                 T = rr(T);
 58             else
 59                 T = rl(T);
 60         }
 61     }
 62     T->height = max(getHeight(T->left), getHeight(T->right)) + 1;
 63     return T;
 64 }
 65
 66 Tree ll(Tree A)
 67 {
 68     Tree B = A->left;
 69     A->left = B->right;
 70     B->right = A;
 71     A->height = max(getHeight(A->left), getHeight(A->right)) + 1;
 72     B->height = max(getHeight(A->left), A->height) + 1;
 73     return B;
 74 }
 75
 76 Tree rr(Tree A)
 77 {
 78     Tree B = A->right;
 79     A->right = B->left;
 80     B->left = A;
 81     A->height = max(getHeight(A->left), getHeight(A->right)) + 1;
 82     B->height = max(A->height, getHeight(B->right)) + 1;
 83     return B;
 84 }
 85
 86 Tree lr(Tree A)
 87 {
 88     A->left = rr(A->left);
 89     return ll(A);
 90 }
 91
 92 Tree rl(Tree A)
 93 {
 94     A->right = ll(A->right);
 95     return rr(A);
 96 }
 97
 98 int getHeight(Tree T)
 99 {
100     if (T == NULL) return 0;
101     else return T->height;
102 }
103
104 int max(int a, int b)
105 {
106     return a > b ? a : b;
107 }
108
109 Tree createNode(int X)
110 {
111     Tree T;
112     T = new Node;
113     T->data = X;
114     T->left = T->right = NULL;
115     T->height = 1;
116     return T;
117 }

View Code

转载于:https://www.cnblogs.com/lxc1910/p/8810906.html

pta 编程题10 Root of AVL Tree相关推荐

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

  2. 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码

    Root of AVL Tree  2013年浙江大学计算机学院免试研究生上机考试真题,是关于AVL树的基本训练. 原题链接:PTA | 程序设计类实验辅助教学平台 题目描述 AVL 树是一种自平衡的 ...

  3. PAT 1066. Root of AVL Tree (25) 回レ!雪月AVL

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

  4. JavaScript初学者编程题(10)

    JavaScript初学者编程题(10) 题目:将一个正整数分解质因数.例如:输入90,打印出90=233*5. HTMl部分 <input type="text" id=& ...

  5. PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)

    文章目录 题目分析 题目链接 题目分析 图片来源:acwing 分析 平衡树(AVL树)是平衡二叉搜索树的简称,当然需要满足二叉搜索树的性质,左子树小于根,根小于等于右子树:然后还要满足平衡树的基本特 ...

  6. PAT A1066 Root of AVL Tree ——春水碧于天,画船听雨眠

    PAT A1066 Root of AVL Tree AVL这东西记一次忘一次,每次看就像披着初恋外衣的旧情人(or reverse) 以下应该是较为标准的模板方法,只是好久没有用过指针了,所以写了个 ...

  7. PAT1066 Root of AVL Tree (25)(AVL树)

    题意: 给出一系列要插入平衡搜索二叉树的数,要求输出最后的根节点 思路: 没其他办法,完完全全是AVL树的插入节点模拟,这题就不会写,看别人代码写的. #include<iostream> ...

  8. pta编程题python答案提交显示非零返回_PTA中提交Python3程序的一些套路

    0. FAQ whileTrue: raw=input()if raw == '':break print(sum(map(int, raw.split()))) 0.1 提交后提示"答案错 ...

  9. 1066 Root of AVL Tree 需再做

    1. 这题如果不知道平衡二叉树怎么平衡的(左旋右旋那一套)应该不可能做出吧,那就输出中位数回点血了. 2. 需要具备的基础知识:怎么将结点插入平衡二叉树. 3. 我犯的一个错误:把更新高度的函数直接返 ...

  10. 【PAT A1066】Root of AVL Tree

    #include <cstdio> #include <algorithm> using namespace std;struct node {int v, height; / ...

最新文章

  1. c++的uint8不赋值_2021国考 | 用对方法后,赋值法竟然变得如此简单!
  2. opencv 车牌切割
  3. Java工程师知识图谱
  4. sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞
  5. lambda表达式学习(详细理解 ) 重点在最后
  6. Excel字符串截取(leftrightmid)
  7. 【NIPS 2017】基于深度强化学习的想象力增强智能体
  8. zuc算法代码详解_ZUC算法了解
  9. INTERVAL 用法
  10. OpenStack开源云平台
  11. 量化投资与python语言_在量化投资领域,为什么Python如此受欢迎?
  12. 启动MySQL发生系统错误 1058
  13. 电商平台开发你需要注意下面的几点!
  14. 卡通的平板卧推男孩动画特效
  15. 使用java进行SSL证书的签名与签验
  16. 如何提高福禄克DTX-1800的测试余量
  17. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于流浪宠物领养系统8xg84
  18. ELLE风尚大典暨全球75周年庆典在成都环球中心举办
  19. 多少鸿蒙冰心对无间,鸿蒙造句
  20. Module-Huey任务队列

热门文章

  1. 实战案例:探索星巴克的世界分布
  2. Ubuntu 搭建Facebook ATC弱网测试环境 使用路由器搭建ATC
  3. NGS中的一些软件功能介绍
  4. HDU1215 七夕节(模拟 数学)
  5. 第八章、面向对象设计
  6. godaddy虚拟主机access数据库中文乱码的解决方法
  7. warning: mysql-community-libs-5.7.11-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5
  8. 实验一:命令解释程序
  9. C#用正则表达式 获取网页源代码标签的属性或值
  10. 如何遍历json属性和动态添加属性