其它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;
}

最新文章

  1. 【转】 制作Android Demo GIF:程序演示效果GIF图录制
  2. HttpClient 4.x 执行网站登录并抓取网页的代码
  3. uC/OS-III学习2::uC/OS-III LED闪烁实验
  4. 随便写写,当作了解--Css
  5. HDOJ-1012 u Calculate e(水)
  6. 矩形旋转碰撞,OBB方向包围盒算法实现
  7. asp.net弹出层实例
  8. 实现一个与内容合二为一的ActionBar动画效果
  9. 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序
  10. for计算100以内的偶数和
  11. Python 多线程库总结
  12. C语言嵌套循环作业
  13. nyoj 背包问题
  14. Html5的学习之旅-Html5的web Storage概述(16)
  15. springboot秒杀课程学习整理1-2
  16. 使用本地缓存快还是使用redis缓存好?
  17. 《HTTP协议:菜鸟入门系列》
  18. Django框架之第二篇
  19. 洛谷P1219 :八皇后(DFS+回溯)
  20. [leetcode]37. Sudoku Solver 解数独

热门文章

  1. SQL Server事务回滚对自增键的影响
  2. php用百度地图API进行逆地址解析
  3. SAS笔记(4) FIRST.和LAST.临时变量
  4. python numpy 判断ndarray 中是否有 nan
  5. POJ1044 Date bugs
  6. props简单小栗子
  7. CF E .Tree with Small Distances(树上的贪心)
  8. Python 简单的方法爬取b站dnf视频封面
  9. applicationContext-datasource.xml
  10. GUI的最终选择 Tkinter(三):Checkbutton组件和Radiobutton组件、LabelFrame组件