二叉平衡树的旋转操作
旋转是很多二叉平衡树维持平衡的主要手段,在这里复习一下。其实旋转过程中节点位置的变化只要遵循一个原则就行了:比Root小的在左子树,比Root大的在右子树。(当然这里前提条件是左小右大)。
情况一:插入F节点导致失衡:
这里失衡的是A的左右子树,很容易就可以想到旋转B-A链,值得注意的是E节点,它原先在B的右子树,现在也依然在B的右子树,它原先在A的左子树,现在也依然在A的左子树。
若插入F节点在D的右子树处,旋转操作依然是上图那样,不谈。
但如果插入F节点是E的孩子就不一样了。
情况二:插入F节点导致失衡:
插入节点是E的孩子时,如果我们还像上面那样旋转B-A链,旋转后的树依然是不平衡的。事实上,这样的旋转使得B成为了新的根节点,而原图中比B大的节点有4个,比B小的节点只有D,若B为根其左子树只能为D,必定是不平衡的。
我们仔细观察原图,这里E节点是很特殊的节点。首先它是实际执行了插入操作的节点,其次图中比E小的节点有B、D、F,比E大的节点有A、C。如果能够让E节点做新的根节点就很好平衡了,那么怎样让E节点“上位”呢?
方法是进行两次旋转,如下图:
E节点恐成最大赢家……
插入节点是E的右子树的情况与之类似,这里给出旋转图:
F比E大,双旋之后还是在E的右节点。
双旋看图理解起来简单,实际实现时要注意,我们可以判断失衡的是A节点,由A有直接关系的是B和C,那么我们怎么知道新插入的F节点是D的子树还是E的子树呢?这里的方法是比较F节点值与B的大小,大则是E的子树,要左-右共两次旋转,小则是D的子树,要一次右旋转。
当然还要考虑镜像情况:
情况三:插入 F导致失衡:
进行一次左旋,关注D节点,它比C小,旋转后依然在C的左子树。
情况四:插入F导致失衡:
这时候左旋失败,理由和之前右旋失败类似,比C节点大的节点只有一个E,C是没法做新的根节点的。这里特殊的是D节点。
进行右-左两次双旋就可以了。D节点:爽到……
插入节点是D的右子树情况类似,RT:
二叉平衡树的旋转操作相关推荐
- 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...
- 二叉平衡树(C++)
背景: 二叉平衡树,就是根据二叉搜索树进行优化,让其速度更加的快,如果读者没有学过二叉搜索树,可以前往以下链接查看资料: http://t.csdn.cn/Sjjjshttp://t.csdn.cn/ ...
- 二叉平衡树的插入和删除操作
[转载]二叉平衡树的插入和删除操作 1. 二叉平衡树 二叉排序树查找.插入和删除操作的时间复杂度和树的深度n有关.构建树时,当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长 ...
- 二叉平衡树(AVL树)从演变、平衡、旋转加练习题逐步分析,看不会过来打我
想要了解AVL树,就得了解它是怎么演化来的,它并不是凭空创造的一个新数据结构,而是发现其他数据结构的不完美而演变过来的. 二叉查找树 我想二叉排序树结构的起源一定是来源于生活,二叉树只有一个根节点,每 ...
- 数据结构与算法——二叉平衡树(AVL树)详解
文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...
- AVL树(二叉平衡树)详解与实现
公众号文章链接 AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树 ...
- 【数据结构进阶】二叉平衡树
一. 二叉平衡树 概念 二叉搜索树有称 二叉排序树,它也可以是一个空树. 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值 它 ...
- 《二叉平衡树(一)》
[一]二叉搜索树的概念 定义:二叉搜索树又称二叉排序树,他或者就是一棵空树,是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值. 2.若它的右子树不为空,则右子树 ...
- C语言实现二叉平衡树
[前置知识]二叉树和二叉排序树 目录 1.什么是AVL树 2.怎么平衡 前言 对于大量的数据而言,链表的线性访问时间太慢,不宜使用.本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行 ...
- 二叉平衡树(AVL树)详细理解
二叉平衡树(AVL树) AVL树插入元素结论 单旋转: 双旋转: 如果看到后面会发现,我下面举得列子,类型一和类型三和我结论里面的有点不一样,那是因为类型一的节点4和类型三的节点14无论以何种方式都能 ...
最新文章
- python数据处理与机器学习
- Linux C 的风格
- 字符编码解码整合工具
- linux修改密码最短生存时间,Linux基础命令---修改用户密码
- plsql存储过程修改后怎么保存_分布式基础-存储引擎
- linux shell学习笔记(二) 变量和运算符
- 处理血压信号_测血压检测健康,8款高品质血压计推荐
- 什么是hypernetworks? hypernetworks简单介绍
- Axure总结和感想
- 企业微信api,企业微信sdk接口
- Android Bmob之用户更改头像(上传图片、下载图片和更新图片)
- 如何采集小红书最新版(2018年9月)数据
- Kindle的使用体验
- mysql、oracle、sqlserver各自的默认端口号
- Vue.js入门(学习笔记)
- 企业邮箱和个人邮箱之间有什么区别?
- STM32F407ZGT6的串口通信
- npm ERR! code ETIMEDOUTnpm ERR! errno ETIMEDOUTnpm ERR! network request to http://nexus.h3yun.com:
- 个人对于“初链”白皮书和黄皮书的解读
- mldonkey系列之四──Mldonkey命令解释[zt]