其它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. 将一个mapList转换为beanList

    public static <T> List<T> copyMapToBean(   List<Map<String, Object>> resultM ...

  2. Unity 中动态修改碰撞框(位置,大小,方向)

    在Unity中,玩家处于不同的状态,要求的碰撞框的 位置/大小/方向 会有所改变,怎么动态的修改碰撞框呢? 下面是Capsure Collider(胶囊体)的修改: CapsuleCollider.d ...

  3. jquery 操作表格实例

    案例1:隔行变色,滑动,点击变色以(选中取消效果)(addClass(),removeClass(),toggleClass()) Html: <h4>1.隔行变行</h4> ...

  4. 【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]

    思路:用一个栈来管理树的层次关系,索引代表节点的深度 方法一: TreeNode* recoverFromPreorder(string S) { /* 由题意知,最上层节点深度为0(数字前面0条横线 ...

  5. struts2学习笔记——常见报错及解决方法汇总(持续更新)

    操作环境:(1)Tomcat 7.0.72.0 (2)OS Name: Windows 7  (3)JVM Version:  1.8.0_25-b18  (4)eclipse Version: Ke ...

  6. retrying模块的安装及使用

    安装retrying模块: win10用户在联网的情况下直接在cmd.exe里面键入"pip install retrying"  即可安装retrying模板 在网页正常浏览的过 ...

  7. 「模拟赛20180307」三元组 exclaim 枚举+树状数组

    题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...

  8. java socket 网络通信 指定端口的监听 多线程 乱码

    Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...

  9. tomcat memecached session 共享同步问题的解决

    事件缘由:一个主项目“图说美物”,另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 w ...

  10. "微信戴圣诞帽"的一个简易实现程序

    准备安装 由于是利用别人写的人脸识别的一个库,所以需要在import之前安装好相应的环境.如果直接安装face_recognition库的时候就会直接提示缺少的相应的dlib库.而dlib库本身需要c ...