避免 BST 中的长 "bare" 分支和平衡

Avoiding long "bare" branches in BST and balancing

所以我正在对二叉搜索树进行一些试验,这里需要一些提示。

我想要实现的是 self-balancing BST,但不是通常的。我正在寻找的 BST 应该只有在出现长 "bare" 分支时才会自行平衡。请参阅下面的示例,以便更好地理解我的意思。

         add(6,5,7,1,2,3,4);

          Result BST                        Balanced 
        (before balance)       
               6                              6
            5     7        balance       3         7
         1                  -->       1     4
           2                            2     5
             3
                4         


     x=5
    (long bare branch of length x occurs (5,1,2,3,4)) 
    Balancing starts only when a long bare branch occurs in the BST!
    In this case, after add(4);

长裸分支:最多有一个child的x个节点的序列,其中x是给定的常数(例如,它是5)。

因此,一旦我将 (4) 添加到示例 BST,就会出现一个长的裸分支,然后 BST 才需要修复。所以在某种程度上,它有点像 AVL 树,但只有当一定数量的不平衡节点堆积时才开始平衡节点。

我对这个的可能实现有一些想法,但我认为它非常低效(我必须在 add() 或 remove() 之后遍历整个树,并且只需计算连续的节点一个或更少 child.)

对于这种平衡和裸分支出现检测的更有效算法有什么想法吗?

非常感谢您。

长"bare"分支检测:

  • add():只需要往上走x个节点。由于 x 是一个(应该很小的)常数,所以 O(1)

  • remove():向上查找,直到找到具有两个 children 或没有 parent 的节点,或者达到 x 步。如果还没有到x,往下看,直到找到一个none有两个以上的children(或none)。不能超过 x 步,所以又是 O(1)。