首页 > 其他分享 >平衡二叉树

平衡二叉树

时间:2024-02-24 17:23:10浏览次数:25  
标签:左子 右子 右旋 二叉树 平衡 节点

平衡二叉树


特点: 任意节点左右子树的高度不超过1

反例:

10节点的左子树高度为0,右子树高度为3


这是平衡二叉树

这也是平衡二叉树


如何保持平衡

添加一个节点后,该树不再是平衡二叉树-》旋转


左旋,多余左节点做右节点

复杂的左旋

10的多余左节点9。给予前父节点7作为右节点


右旋 ,多余右节点做左节点

复杂右旋

4的多余右节点5,给予前父节点7作为左节点


需要旋转的4种情况

左左

根节点左子树左子树(在这张图上指{2}的分支)

有节点插入,导致不平衡。

左子树{4}的分支

左子树的左子树 {2}的分支

注意,{2}->{3}也是左左的情况

一次右旋就可以平衡


左右

根节点左子树右子树(图中指{5}的分支)

有节点插入,导致二叉树不平衡

一次右旋之后,没有平衡,再继续左旋右旋操作也没有平衡


回归最初状态

先进行局部左旋(紫色部分),转化为左左

一次整体右旋后,平衡


右右

根节点右子树右子树(图中{11}的分支)

有节点插入,导致二叉树不平衡

经过一次左旋平衡


右左

根节点右子树左子树(图中指{9}的分支)

有节点插入,导致二叉树不平衡

局部右旋,转化为右右

经过整体左旋,平衡


总结

平衡二叉树

  • 任意节点的左右子树的高度差不超过1的二叉树

平衡二叉树保持平衡的方法

  • 左旋

    • 提升第一个失衡的节点为父节点

    • 原父节点降级为失衡节点的左节点

    • 失衡节点多余的左节点成为原父节点的右节点

  • 右旋

    • 提升第一个失衡的节点为父节点

    • 原父节点降级为失衡节点的右节点

    • 失衡节点多余的右节点成为原父节点的左节点

平衡二叉树不平衡的4个情况

  • 左左

    • 根节点左子树的左子树中插入节点后导致的不平衡

    • 经过一次右旋解决

  • 左右

    • 根节点左子树的右子树中插入节点后导致的不平衡

    • 先经过一次局部左旋,转化为左左

    • 再经过一次整体右旋解决

  • 右右

    • 根节点右子树的右子树中插入节点后导致的不平衡

    • 经过一次左旋解决

  • 右左

    • 根节点右子树的左子树中插入节点后导致的不平衡

    • 先经过一次局部右旋,转化为右右

    • 再经过一次左旋解决

标签:左子,右子,右旋,二叉树,平衡,节点
From: https://www.cnblogs.com/HIK4RU44/p/18031301

相关文章

  • 二叉树查找树遍历
    二叉树查找树遍历存放规则:小的存左边、大的存右边、一样的不存前序、中序、后序指的是当前结点的顺序前序:当前结点、左子节点、右子节点中序:左子节点、当前节点、右子节点后序:左子节点、右子节点、当前结点前序遍历中左右遍历完左树遍历右树从上到下,根节点->从左......
  • 二叉树
    cal的题目分类说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。相信只要耐心看完,都会有所收获。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时......
  • 二叉树
    二叉树概念二叉树是一种特殊的树,每次分叉不超过两部分。结构根节点如果一个结点没有子树,那就称为叶子结点。左子树右子树完美二叉树如果一个二叉树的高度为h,从第二层开始每层结点树都是上一层的两倍。左子树2*x(根节点)右子树2*x(根节点)+1二叉树的遍历前序......
  • 【数据结构】C语言实现二叉树的相关操作
    树定义树(Tree)是n(n>=0)个结点的有限集若n==0,称为空树若n>0,则它满足如下两个条件:有且仅有一个特定的称为根(Root)的结点其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3,...Tm,其中每一个集合本身又是一棵树,称为根的子树(SubTree)术语结点:数据元素结点的度:结点......
  • 二叉树小结
     ===============================================================================================二叉树的定义方式:1.顺序表:typedefstructSqTree{chardata[maxsize];boolisNULL;}SqTree;2.链表structnode{intval;structnode*lchil......
  • 力扣递归之 236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例1:输入:root=[3,5,1,6,2,0,8,null,n......
  • leedcode 二叉树的最小深度
    自己写的:#二叉树节点的定义classTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightclassSolution:defminDepth(self,root:Optional[TreeNode])->int:#......
  • leedcode 平衡二叉树
    对称二叉树走不通  201/228 个通过的测试用例classSolution:defisBalanced(self,root:Optional[TreeNode])->bool:queue=[root]ifnotroot:returnTrueifnotroot.leftandnotroot.right:returnTr......
  • (20/60)二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先
    过外婆八十寿宴,补卡二叉搜索树的最小绝对差leetcode:530.二叉搜索树的最小绝对差双指针中序遍历法思路搜索树的最小绝对差一定出现在中序遍历的相邻两个元素之间。设置前后两个指针,每次对比“历史最小”与当前node->val-pre->val的值哪个更小,进行相应更新。复杂度分析......
  • 晚上调代码时写对拍程序之——为了不手写平衡树而乱搞的可支持随机访问、快速插入、快
    前言由于需要一个可支持随机访问、快速插入、快速删除的数据结构,但是我除了平衡树实在是想不到别的东西了,于是就乱搞出了一个这样的东西——abstract数组。但是,这玩意好像码量和平衡树差不多......不过!我认为她还是有优点的:相比起平衡树,她应该更不容易出锅?总之,不管怎么样,还是......