美文网首页
数据结构平衡二叉树中的旋转

数据结构平衡二叉树中的旋转

作者: 董江鹏 | 来源:发表于2018-01-06 21:23 被阅读0次

网上关于平衡二叉树的文章大多是摆几张图,然后就开始贴代码,很多具体的细节都没有说清楚,需要读者去试错。本篇文章试图说明这些细节,希望读者看了这篇文章之后,就能立马实现出来。
只说插入的情况,删除的情况和插入差不多,旋转的四个情况了解清楚了都好说。

Tree_Rebalancing.png

图片来自维基百科,作为参考讲解起来比较方便。

  1. 左左情况
    注意,此时的左左情况是基于自下而上(从插入的新叶子节点往上查找)的第一个不平衡的节点。这个基准点很重要,所有的操作都与这个点有关,反而新插入的叶子节点不一定需要参与旋转。
    图中的root节点就是基准点。
    如果root的左子树pivot存在,并且pivot的左子树也存在,则满足左左情况,进行一次右旋操作,即可平衡。
    旋转实施起来比较简单,此文不再赘述。
  2. 右右情况
    图中的root节点就是基准点(同上)。
    如果root的右子树pivot存在,并且pivot的右子树也存在,则满足右右情况,进行一次左旋操作,即可平衡。
  3. 左右情况
    注意,此时的图有误导的可能,基准点不再是root节点,因为root节点是平衡的。
    现在的基准点是root节点的父节点,我们暂且称它为parent节点。
    如果parent的左子树root存在,并且root的右子树也存在,则满足左右情况,先进行一次左旋操作,变成第一种情况。基准点始终不变,再按第一种情况进行一次右旋操作,即可平衡。
  4. 右左情况
    跟第三种情况类似,root节点的父节点parent为基准点。
    如果parent的右子树root存在,并且root的左子树也存在,则满足右左情况,先进行一次右旋操作,变成第二种情况。基准点始终不变,再按第二种情况进行一次左旋操作,即可平衡。

另外,给大家推荐一个可视化的工具,叫visualgo。
https://visualgo.net/zh/bst
如果具体怎么旋转的不好想出来和画出来,可以参考这个工具。每个值的插入都会以动画的形式呈现出来,右下角还有伪代码解释每一步操作,理解起来会很有帮助。

相关文章

  • 数据结构 - 概要

    数组 链表 堆/栈/队列 树 数据结构 - 二叉树数据结构 - 二叉查找树数据结构 - 平衡二叉树数据结构 - A...

  • 数据结构平衡二叉树中的旋转

    网上关于平衡二叉树的文章大多是摆几张图,然后就开始贴代码,很多具体的细节都没有说清楚,需要读者去试错。本篇文章试图...

  • C语言:平衡二叉树汇总

    定义: 平衡二叉树(Balanced Binary Tree),这个性质,在数据结构的发展中出现了几种平衡二叉树。...

  • 树结构入门教程-平衡二叉树双旋转

    我们在前面学习了平衡二叉树的左旋转和右旋转,在有些特殊的需求中,往往我们只通过左旋转或者是右旋转是无法完成对二叉排...

  • [译文]跳表:一种平衡树的概率性替代品

    _ 跳表是一种可以替代平衡树的数据结构。跳表追求的是概率性平衡,而不是严格平衡。因此,跟平衡二叉树相比,跳表的插入...

  • 平衡二叉树与红黑树的对比

    AVL树(平衡二叉树) AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,...

  • 音视频开发之旅(28) 算法序列 - 平衡二叉树

    目录 平衡二叉树 左旋转、右旋转、双旋转的原理 代码实现 资料 收获 上一篇我们学习实践了二叉查找树,其结合了链表...

  • B+树为何作为索引存储结构

    前言 本文章主要说明,相比较B树和平衡二叉树,B+树作为数据库的索引的数据结构优势在哪 平衡二叉树的劣势 数据库作...

  • 二叉树 :有左右之分,次序不能颠倒 完全二叉树是一种效率很高的数据结构,二叉排序树要借助平衡性来实现,而平衡性基于...

  • golang 手撸 平衡二叉树

    golang 手撸 平衡二叉树 树是一种计算机数据结构中非常常用的一种结构,其中就包含了:平衡二叉树,这种树是一种...

网友评论

      本文标题:数据结构平衡二叉树中的旋转

      本文链接:https://www.haomeiwen.com/subject/erkunxtx.html