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

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

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

分为以下四种情况:

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

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

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

 #include <iostream>
using namespace std; typedef struct Node *Tree;
struct Node
{
int data;
Tree left;
Tree right;
int height;
}; Tree insert(Tree T, int X);
Tree ll(Tree A);
Tree lr(Tree A);
Tree rr(Tree A);
Tree rl(Tree A);
int getHeight(Tree T);
int max(int a, int b);
Tree createNode(int X); int main()
{
int N, X, i;
cin >> N >> X;
Tree root = createNode(X);
for (i = ; i < N; i++)
{
cin >> X;
root = insert(root, X);
}
cout << root->data;
return ;
} Tree insert(Tree T, int X)
{
if (!T)
T = createNode(X);
else if (X < T->data)
{
T->left = insert(T->left, X);
if (getHeight(T->left) - getHeight(T->right) == )
{
if (X < T->left->data)
T = ll(T);
else
T = lr(T);
}
}
else if (X > T->data)
{
T->right = insert(T->right, X);
if (getHeight(T->right) - getHeight(T->left) == )
{
if (X > T->right->data)
T = rr(T);
else
T = rl(T);
}
}
T->height = max(getHeight(T->left), getHeight(T->right)) + ;
return T;
} Tree ll(Tree A)
{
Tree B = A->left;
A->left = B->right;
B->right = A;
A->height = max(getHeight(A->left), getHeight(A->right)) + ;
B->height = max(getHeight(A->left), A->height) + ;
return B;
} Tree rr(Tree A)
{
Tree 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;
} Tree lr(Tree A)
{
A->left = rr(A->left);
return ll(A);
} Tree rl(Tree A)
{
A->right = ll(A->right);
return rr(A);
} int getHeight(Tree T)
{
if (T == NULL) return ;
else return T->height;
} int max(int a, int b)
{
return a > b ? a : b;
} Tree createNode(int X)
{
Tree T;
T = new Node;
T->data = X;
T->left = T->right = NULL;
T->height = ;
return T;
}

pta 编程题10 Root of AVL Tree的更多相关文章

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

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

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

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

  5. pat1066. Root of AVL Tree (25)

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

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

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

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

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

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

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

随机推荐

  1. C++开源库(一) ----log4cpp详解

    我们在写程序的时候通常会希望将一些信息记录下来,方便我们进行日后的一些信息跟踪,错误排查等等.比如:我们在进行数据库操作的时候,我们通常希望知道现在是程序的哪一部分进行了数据库的操作,所以我们会记录下 ...

  2. 用RegularJS开发小程序 — mpregular解析

    本文来自网易云社区. Mpregular 是基于 RegularJS(简称 Regular) 的小程序开发框架.开发者可以将直接用 RegularJS 开发小程序,或者将现有的 RegularJS 应 ...

  3. Zookeeper安装和部署

    Zookeeper安装和部署:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用 ...

  4. 有关UPDATE操作的一些想法

    我们平常写代码的时候,无疑都会接触大量的数据CURD操作.第一反应是这太简单了,那么你在编写UPDATE操作的时候是怎样的逻辑呢?比较下面两段伪代码: code exp.1 $SQL = " ...

  5. 2017-11-7 NOIP模拟赛

    1.数学老师的报复 #include<iostream> #include<cstdio> using namespace std; int cnt; ]; long long ...

  6. [Xcode 实际操作]三、视图控制器-(6)UINavigationController导航栏样式

    目录:[Swift]Xcode实际操作 本文将演示对导航栏进行样式设置,以及更改导航顶部的提示区. 选择编辑第一个视图控制器文件. import UIKit class FirstSubViewCon ...

  7. Mysql的子查询与连接查询

    子查询: 在一个 select 语句中,嵌入了另外一个 select 语句, 那么被嵌入的 select 语句称之为子查询语句 主查询和子查询的关系: 子查询是嵌入到主查询中,子查询是辅助主查询的,要 ...

  8. File类、递归

    File类.递归 1.1File类概述 java.io.File表示文件和目录路径名的抽象类.可以对文件和文件夹进行创建删除.获取.判断.遍历等功能. 1.2路径\文件分割符,相对路径绝度路径 1.2 ...

  9. php静态方法和属性

    静态方法和属性由static关键字定义 静态方法和属性不用实例化也可以直接访问,如 self::test(),self::tt 类实例化后可以访问静态方法,但是不可以访问静态属性 声明类属性或方法为静 ...

  10. 8、kvm虚拟机添加硬盘

    kvm虚拟机添加硬盘qemu-img创建一块新的硬盘 qemu-img create -f qcow2 /kvm-data/kvm/jumperhost_disk1.qcow2 50G 关闭虚拟机 v ...