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

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

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

    1.增加节点

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

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

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

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

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

    1.寻找失衡节点,

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

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

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

    2.删除节点

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

  • 相关阅读:
    使用Jenkins进行Android自动打包,自定义版本号等信息【转】
    Android config Android.mk parameter
    cocos2D-X config external library
    OpenCV Install OpenCV with Visual Studio
    cmake make library
    cocos2D-X create image sprite solution
    cocos2d-X 打开一个文件是否跨平台
    android use NDK api call AssetManager
    android add asset file
    android error: cannot use ‘throw’ with exceptions disabled
  • 原文地址:https://www.cnblogs.com/trickofjoker/p/10505262.html
Copyright © 2011-2022 走看看