pta 编程题10 Root of AVL Tree
2024-09-29 13:42:34
其它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;
}
最新文章
- 【转】 制作Android Demo GIF:程序演示效果GIF图录制
- HttpClient 4.x 执行网站登录并抓取网页的代码
- uC/OS-III学习2::uC/OS-III LED闪烁实验
- 随便写写,当作了解--Css
- HDOJ-1012 u Calculate e(水)
- 矩形旋转碰撞,OBB方向包围盒算法实现
- asp.net弹出层实例
- 实现一个与内容合二为一的ActionBar动画效果
- 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序
- for计算100以内的偶数和
- Python 多线程库总结
- C语言嵌套循环作业
- nyoj 背包问题
- Html5的学习之旅-Html5的web Storage概述(16)
- springboot秒杀课程学习整理1-2
- 使用本地缓存快还是使用redis缓存好?
- 《HTTP协议:菜鸟入门系列》
- Django框架之第二篇
- 洛谷P1219 :八皇后(DFS+回溯)
- [leetcode]37. Sudoku Solver 解数独
热门文章
- SQL Server事务回滚对自增键的影响
- php用百度地图API进行逆地址解析
- SAS笔记(4) FIRST.和LAST.临时变量
- python numpy 判断ndarray 中是否有 nan
- POJ1044 Date bugs
- props简单小栗子
- CF E .Tree with Small Distances(树上的贪心)
- Python 简单的方法爬取b站dnf视频封面
- applicationContext-datasource.xml
- GUI的最终选择 Tkinter(三):Checkbutton组件和Radiobutton组件、LabelFrame组件