平衡二叉树的构造问题以及为了维护它的平衡所要进行的LL旋转、RR旋转、LR旋转、RL旋转。

一、平衡二叉树的构造

node *insert(node *root, int x) {if (root == 0) {root = &all[total++];root->left = root->right = 0;root->val = x;root->height = 0;} else if (x < root->val) {root->left = insert(root->left, x);if (height(root->left) - height(root->right) == 2) {root = (x < root->left->val) ? LL(root) : LR(root);}} else {root->right = insert(root->right, x);if (height(root->right) - height(root->left) == 2) {root = (x > root->right->val) ? RR(root) : RL(root);}}root->height = max(height(root->left), height(root->right)) + 1;return root;
}

二、LL旋转

所谓LL旋转并不是指旋转方向,而是指新插入导致不平衡的元素位于左子树的左儿子位置,也就是LeftLeft。

看一下这种旋转的示意图:

node *LL(node *k2) {node *k1 = k2->left;k2->left = k1->right;k1->right = k2;k2->height = max(height(k2->left), height(k2->right)) + 1;k1->height = max(height(k1->left), height(k1->right)) + 1;return k1;
}

三、RR旋转

同样LL旋转是指新插入导致不平衡的元素位于右子树的右儿子位置,也就是RightRight。

看一下这种旋转的方式示意图:

node *RR(node *k1) {node *k2 = k1->right;k1->right = k2->left;k2->left = k1;k1->height = max(height(k1->left), height(k1->right)) + 1;k2->height = max(height(k2->left), height(k2->right)) + 1;return k2;
}

四、LR旋转和RL旋转

LR和RL则分别表示位于左子树的右儿子和右子树的左儿子。

1.对于LR旋转,首先将最近的不平衡结点k3的左子树进行RR旋转,再将k3本身进行LL旋转。

node *LR(node *k3) {k3->left = RR(k3->left);return LL(k3);
}

2.对于RL旋转,首先将最近的不平衡结点k3的右子树进行LL旋转,再将k3本身进行RR旋转。

node *RL(node *k1) {k1->right = LL(k1->right);return RR(k1);
}

THE END.

平衡二叉树的旋转及其代码实现相关推荐

  1. 平衡二叉树的旋转_平衡二叉树的旋转

    一.平衡二叉树的定义 为避免树的高度增长过快,降低二叉树的排序性能,规定在插入和删除二叉树结点时,保证任意结点的左右子树高度差的绝对值不大于1.这样的二叉树被称为平衡二叉树(Balanced Bina ...

  2. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  3. OpenCV:OpenCV图像旋转的代码

    OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...

  4. matlab将图片旋转的代码_空间曲线绕空间直线旋转生成的旋转曲面方程

    校内建模的一道题,虽然我认为这么trivial的东西前人早就造好轮子了,但是找遍所有能找到的网络资料.文献都没找到答案,只好自己造了个轮子. 设空间曲线 : 绕 : 旋转得到的曲面方程为 ,则 的方程 ...

  5. Unity笔记---模拟行星旋转(含代码)

    一.模拟行星旋转 1.先创建名字为Sphere的3D object.(如图,是一个球状体.) 2.在Asset里面可以创建 material 给我们刚刚创建的小球增加材质(我们现在所学的materia ...

  6. Algorithm:树结构(二叉树/多路查找树/字典树)的简介、具体结构(FBT/CBT/BST/BBT/Heap/Huffman、B树/B+树/R树、字典树)及其运算(增删查/遍历/旋转)、代码实现

    Algorithm:树结构(二叉树/多路查找树/字典树)的简介.具体结构(FBT/CBT/BST/BBT/Heap/Huffman.B树/B+树/R树.字典树)及其运算(增删查/遍历/旋转).代码实现 ...

  7. 旋转360 css 动画效果,使用CSS3动画属性实现360°无限循环旋转【代码片段】

    使用CSS3的animation动画属性实现360°无限循环旋转. 代码片段:   //图片路径自定义 CSS样式书写如下: #change{ position:absolute; right:200 ...

  8. unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)

    123 说: 雨松大大,有个问题想请教一下,我用UNET构建了个小场景,在电脑上可以客户端可以连接到服务器,Windows和Linux都可以,发布到安卓缺连不了,这是问什么呢 说: 求教一下,刚刚接触 ...

  9. 平衡二叉树-AVL c/c++代码实现

    参考:https://www.bilibili.com/video/BV1rt411j7Ff?t=703大佬视频 一份代码,代码中有注释,对应着洛谷的**P3369 [模板]普通平衡树** /*Kee ...

最新文章

  1. 在数据库组件中用业务规则剖析挑选数据
  2. String.replaceAll() 正则表达式
  3. 配置系统在开机时启动虚拟机
  4. python列表的索引算法_Python-确定列表是否对称的算法
  5. java int 数据类型_Java 基本数据类型
  6. 给 TComboBox 添加图标 - 回复 heyongan 的问题
  7. 马云:首批助力欧洲防疫的物资今天到达比利时
  8. 第三方服务-阿里云视频点播服务java服务端SDK相关代码
  9. 【李宏毅2020 ML/DL】P15 Why Deep-
  10. echarts 柱状图如何不顶格_echarts柱状图如何中间对齐而不是底部对齐?
  11. 数据结构—二叉树的遍历
  12. 非华为电脑实现多屏协同、一碰传
  13. 实变函数与泛函数分析学习笔记(三):有界线性算子
  14. Origin申请、安装和激活手记
  15. 线下活动报名|增长骇客:如何利用数据「玩」出新意
  16. MATLAB-数字图像处理 量化
  17. 机器学习作业(第十八次课堂作业)
  18. 怎么才能写好技术文档?这是我的全部经验
  19. 用计算机探索规律有什么知识点5上,用计算器探索规律知识点
  20. python需要电脑多大内存合适_编程用surface怎么样发(学python要多大内存)

热门文章

  1. matlab画电子云,北理工理论物理导论实验一:用MATLAB绘制电子云
  2. 【网站搭建】用阿里云服务器搭建个人网站
  3. 深度学习数据集标注工具、图像语料数据库等资源
  4. ceph运维常用指令
  5. 小米手环NFC读不了卡_小米确认手环、手表之间已支持NFC公交卡相互转移|手环|公交卡|nfc|手机...
  6. 相似度:最长公共子序列--LCS
  7. 批量提取、修改excel文件名称
  8. Android使用BACnet协议进行数据读写测试
  9. 三子棋详细讲解【C语言】
  10. 数组查找、赋值、复制、反转及修改,三种常用排序算法