zoukankan      html  css  js  c++  java
  • [学习记录]平衡树

    平衡树是一种特殊的二叉树,引入了平衡因子概念,对于每一个节点,统计左子树与右子树的高度,两者的差即为平衡因子,平衡因子为-1,1,0时我们认为树是平衡的,当出现2,-2时则认为树失衡了,需要进行调整。同时由于一颗子树的失衡会向根节点传递,所以我们只需要将第一个失衡子树平衡,就能保持整体的平衡。

    平衡树出现失衡的情况只有两种,增加节点时与删除节点时。以下分开讨论。

    1.增加节点

    由于增加节点导致的失衡,一定是因为某一个节点新增加了一个右子树或左子树。而平衡方法就是寻找到合适的继承人节点,让它成为新的子树根节点,并对子树结构进行微调。继承人节点的操作有点类似二叉树删除操作,只不过被替代的节点没有删除而是成为了新根节点的子节点。

    由于我们每插入一个新节点就检查平衡因子,因此当发现失衡时,失衡节点的平衡因子一定是2或-2,只要将一个新的节点代替失衡节点,将失衡节点降级为新节点的子树,那么平衡树就重新平衡了。

    以下将”离新增节点最近的失衡节点“简称为失衡节点,选择算法为:若新增节点处于失衡节点的左子树,则将左子树中值最大的节点作为新的根节点代替失衡节点,失衡节点以及右子树作为新根的右子树;

    若新增节点处于失衡节点的右子树,则将右子树中最小的节点作为新根,失衡节点以及左子树作为新根的左子树。

    这样,每次平衡所需要的操作就是

    1.寻找失衡节点,

    2.根据平衡因子的正负判断新增节点位置,

    3.根据上一步的判断挑选继承节点(左大右小),

    4.删除原来的继承节点,将失衡节点与半边子树组成的失衡子树从原平衡树上剥离,将继承节点放到原失衡节点的位置,并与两颗子树相连。

    2.删除节点

    一开始的删除操作与普通二叉树一样,删除之后更新各个节点的平衡因子,发现第一个失衡节点后进行平衡,操作与增加节点一致。

  • 相关阅读:
    【Unity】自定义编辑器窗口——拓展编辑器功能
    【Unity】AssetBundle的使用——打包/解包
    【Unity】使用Resources类管理资源
    【Unity】使用AssetDatabase编辑器资源管理
    【Unity】协程Coroutine及Yield常见用法
    【Unity】制作简易定时器(Timer)
    python3使用csv模块读写csv文件
    Python3使用csv模块csv.writer().writerow()保存csv文件,产生空行的问题
    MongoDB服务无法启动,发生服务特定错误:100
    ValueError: update only works with $ operators
  • 原文地址:https://www.cnblogs.com/trickofjoker/p/10505262.html
Copyright © 2011-2022 走看看