二叉树旋转

二叉树的旋转主要是应用在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;
}           

双旋就可以直接调用左旋和右旋进行实现,在这里就不再赘述了。至此,左旋右旋就大致这么多。可能有人看到会问,那怎么判断旋转以后是不是平衡了呢? 其实左旋右旋就像是一个工具,需要的时候就直接调用函数就可以了,简单说就像是一个工具人,用我了我就直接给你来着左旋/右旋。其他的以后想到再进行补充,欢迎大家指出我的错误。

二叉树旋转--左旋|右旋相关推荐

  1. nyoj202 红黑树 (二叉树的左旋右旋)

    题目202 题目信息 运行结果 本题排行 讨论区 红黑树 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子 ...

  2. 红黑二叉树的左旋右旋和变色

    小白解析红黑树的基本 什么是红黑树 变色 右旋 什么是右旋呢? 左旋 什么情况下会左旋 什么是红黑树 这就是一个简单的红黑二叉树 红黑二叉树有以下几条基本的规则: 1. 节点分为红色或者黑色. 2.根 ...

  3. HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

    树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...

  4. 字符串左旋右旋——三步旋转法和移相法

    题目:实现一个函数,可以左旋字符串中的k个字符. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 方法一:三步旋转法 左旋程序思路:首先根据画图得知左旋后的结果,然后在分析 ...

  5. avl树左旋右旋的理解

    一直没搞懂非平衡二叉树变平衡二叉树时左旋右旋,今天下定决心搞懂,然后在众多博客中终于找到了这样一篇,非常形象,记录如下: AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大 ...

  6. 详解红黑树之左旋右旋

    为什么要左旋右旋? 为了使得左右子树的高度差在一定范围内,需要通过旋转调整,这样就可以保持平稳的搜索效率 左旋: 步骤 1.设原来E的父节点是father,那么左旋之后需要改变的是: 2.S和fath ...

  7. 字符串的左旋右旋问题

    字符串的左旋右旋其实是一个问题,下面只对右旋进行分析. 当一个字符串进行旋转的时候,字符串的大小会决定有效旋转次数.这里面的有效是指,后面的旋转会与前面的旋转相同,所以我们必须要对旋转次数进行去重. ...

  8. 搞懂平衡二叉树的左旋右旋双旋(Java实现)

    刚看到韩顺平老师的数据结构与算法对于平衡二叉树的讲解(最后会附上地址),有如下理解,希望能帮助大家!哪里需要改正的欢迎指正! 平衡二叉树:一种二叉排序树(BST Binary Sort Tree)的升 ...

  9. winform中实现图片左旋,右旋

    左旋 继续旋转 右旋: 继续右旋 效果展示结束: 下面讲讲利用什么来实现的: 由于不光判断是否是图片的*.BMP;*.JPG;*.GIF;*.TIF;*.PNG 还有*.PDF文件,因此写了个自定义控 ...

最新文章

  1. [转]程序员生涯总结
  2. java类和对象实例对象_Java类、对象和实例的理解
  3. 机器学习基础:分类vs回归
  4. 用ASP.NET Core 2.1 建立规范的 REST API -- 翻页/排序/过滤等
  5. 作者:李廉(1951-),男,合肥工业大学计算机与信息学院教授
  6. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
  7. centos mysql 主从配置_centos7.4安装mysql8,并设置主从配置
  8. python3 输入输出_21.Python3 输入和输出
  9. CGI form标签学习
  10. LaTeX (1)——LaTex环境的下载与安装(Tex live 2020+ Tex studio编辑器、 proTeXt(MiKTeX+TeXstudio编辑器))
  11. javascript笔记——js面试问题
  12. 实体与表映射关系XXX.hbm.xml配置详解(转)
  13. (实验)使用Protel 99se绘制2114存储器芯片(详细)
  14. ucore Lab 1 系统软件启动过程
  15. z2屏幕坏如何从计算机导出数据,闪回收-手机屏幕坏了如何导出数据?手机屏幕坏了怎么用电脑控制?...
  16. 深度学习框架江湖群侠传
  17. 前端工程师为什么会这么值钱?原来真相在这里
  18. 在滴滴云 DC2 云服务器上搭建 ELK 日志采集系统
  19. 群晖NAS使用2步身份验证登录技巧
  20. 番茄炖牛腩做法,味美汤浓开胃爽口,牛腩入口即化,太下饭!

热门文章

  1. 《Don't Make me think》阅读笔记
  2. 主成分分析及PCA函数使用说明
  3. 数学建模学习笔记(21)主成分分析法
  4. 选虚拟桌面与选房子一样重要.
  5. 魅族现在是Android几了,终于等到你,魅族今日推送 Android 10 内测版 Flyme
  6. 2021-5-10 记录一次java-word模板由域代码导致的导出功能问题定位
  7. java http 请求的异常处理
  8. mount 命令详解
  9. 没考计算机二级直接能考三级?计算机三级考试考啥
  10. 夫妻和谐幸福的六大技巧