二叉树旋转--左旋|右旋
二叉树旋转
二叉树的旋转主要是应用在AVL树中,当添加一个节点时候导致左右两个子树的高度差不在是-1 , 1 , 0而变成了2 或者-2。此时就需要用到左旋/右旋了。当然左右旋或者有左旋也是基于左旋和右旋的就是顺序不同,理清旋转的顺序就可以直接调用。
简单的图形表示
- 右旋
在这里我们加入一个20以后会发现在根节点左右两侧不再满足AVL树了,平衡因子由原来的-1变成了-2,这个时候我们以根节点进行一次右旋操作,即上图中的将40变成当前小树的根节点,50 变成40的右子树,此时我们发现40原本有一个有节点,那么我们就将40这个节点原本的右子树取下来变成50的左子树。此时链接起来,我们发现此时的平衡因子变成0,重新平衡,变成了AVL树,这个就是是右旋。
左旋与右旋正好相反,详细步骤可以参考右旋的操作。
AVL树的双旋模式
左右旋
根据上图,我们可以看到初始的树在加入一个新的节点40以后,就不在平衡了,(图中标记为绿色的线)。此时我们可以发现单单只有右旋或者左旋是没有办法将它变平衡,所以采用双旋。首先我们可以发现是根节点的左孩子的右子树上多了一个结点,所以我们采用先左旋再右旋的方式将它转换成为平衡结构。先左旋的时候,我们以根节点的左孩子作为旋转的支点,进行旋转。变成图中的第三个的样子,然后再以根节点作为支点进行右旋,最后就平衡了。
右左旋
- 右左旋与左右旋方式相同,但是方向相反,即根节点的右孩子的左子树上多了一个点,进行先右旋再左旋就可以了。
代码实现
存储结构
typedef struct Node
{ int data;struct Node* pLeft; //定义指向左孩子的指针struct Node* pRight; //定义指向右孩子的指针struct Node* pFather; //定义指向父节点的指针
}Tree;
右旋
void RightRotate(Tree **p)
{if(*p == NULL || (*p)->pLeft == NULL) return;Tree *pNode = *p;Tree* pMark = (*p)->pLeft;//转换三个孩子的关系pNode->pLeft = pMrk->pRight;pMark->pRight = pNode;//判断父亲是否为空,即判断是否是在根节点进行旋转if(pNode->pFather != NULL){if(pNode == pNode->pFather->pLeft){pNode->pFather->pLeft = pMark;}elsepNode->pFather->pRight = pMark; }else //如果父亲结点空,那么将根节点指向pMark即可{*p = pMark;}//更改变动节点指向的父亲节点if(pNode->pLeft != NULL){pNode->pLeft->pFather = pNode;}pMark->pFather = pNode->pFather;pNode->pFather = pMark;
}
左旋
void LeftRotate(Tree** p)
{if(*p == NULL || (*p)->pRight == NULL)return;Tree* pNode = *p;Tree* pMark = (*p)->pRight;//三个孩子的关系pNode->pRight = pMark->pRight;pMark->pLeft = pNode;if(pNode->pFather != NULL){if(pNode == pNode->pFather->pLeft){pNode->pFather->pLeft = pMark;}else {pNode->pFather->pRight = pMark;}}else {*p = pMark;}if(pNode->pRight != NULL){pNode->pRight->pFather = pNode;}pMark->pFather = pNode->pFather;pNode->pFather = pMark;
}
双旋就可以直接调用左旋和右旋进行实现,在这里就不再赘述了。至此,左旋右旋就大致这么多。可能有人看到会问,那怎么判断旋转以后是不是平衡了呢? 其实左旋右旋就像是一个工具,需要的时候就直接调用函数就可以了,简单说就像是一个工具人,用我了我就直接给你来着左旋/右旋。其他的以后想到再进行补充,欢迎大家指出我的错误。
二叉树旋转--左旋|右旋相关推荐
- nyoj202 红黑树 (二叉树的左旋右旋)
题目202 题目信息 运行结果 本题排行 讨论区 红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子 ...
- 红黑二叉树的左旋右旋和变色
小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...
- HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转
树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...
- 字符串左旋右旋——三步旋转法和移相法
题目:实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 方法一:三步旋转法 左旋程序思路:首先根据画图得知左旋后的结果,然后在分析 ...
- avl树左旋右旋的理解
一直没搞懂非平衡二叉树变平衡二叉树时左旋右旋,今天下定决心搞懂,然后在众多博客中终于找到了这样一篇,非常形象,记录如下: AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大 ...
- 详解红黑树之左旋右旋
为什么要左旋右旋? 为了使得左右子树的高度差在一定范围内,需要通过旋转调整,这样就可以保持平稳的搜索效率 左旋: 步骤 1.设原来E的父节点是father,那么左旋之后需要改变的是: 2.S和fath ...
- 字符串的左旋右旋问题
字符串的左旋右旋其实是一个问题,下面只对右旋进行分析. 当一个字符串进行旋转的时候,字符串的大小会决定有效旋转次数.这里面的有效是指,后面的旋转会与前面的旋转相同,所以我们必须要对旋转次数进行去重. ...
- 搞懂平衡二叉树的左旋右旋双旋(Java实现)
刚看到韩顺平老师的数据结构与算法对于平衡二叉树的讲解(最后会附上地址),有如下理解,希望能帮助大家!哪里需要改正的欢迎指正! 平衡二叉树:一种二叉排序树(BST Binary Sort Tree)的升 ...
- winform中实现图片左旋,右旋
左旋 继续旋转 右旋: 继续右旋 效果展示结束: 下面讲讲利用什么来实现的: 由于不光判断是否是图片的*.BMP;*.JPG;*.GIF;*.TIF;*.PNG 还有*.PDF文件,因此写了个自定义控 ...
最新文章
- [转]程序员生涯总结
- java类和对象实例对象_Java类、对象和实例的理解
- 机器学习基础:分类vs回归
- 用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等
- 作者:李廉(1951-),男,合肥工业大学计算机与信息学院教授
- 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
- centos mysql 主从配置_centos7.4安装mysql8,并设置主从配置
- python3 输入输出_21.Python3 输入和输出
- CGI form标签学习
- LaTeX (1)——LaTex环境的下载与安装(Tex live 2020+ Tex studio编辑器、 proTeXt(MiKTeX+TeXstudio编辑器))
- javascript笔记——js面试问题
- 实体与表映射关系XXX.hbm.xml配置详解(转)
- (实验)使用Protel 99se绘制2114存储器芯片(详细)
- ucore Lab 1 系统软件启动过程
- z2屏幕坏如何从计算机导出数据,闪回收-手机屏幕坏了如何导出数据?手机屏幕坏了怎么用电脑控制?...
- 深度学习框架江湖群侠传
- 前端工程师为什么会这么值钱?原来真相在这里
- 在滴滴云 DC2 云服务器上搭建 ELK 日志采集系统
- 群晖NAS使用2步身份验证登录技巧
- 番茄炖牛腩做法,味美汤浓开胃爽口,牛腩入口即化,太下饭!