在BST中避免长“裸”分支和平衡

时间:2016-04-22 22:39:15

标签: algorithm binary-search-tree

所以我正在用二叉搜索树进行一些实验,需要一些提示。

我想要实现的是自平衡BST,但不是通常的BST。我正在寻找的BST应该只在发生长“裸”分支时才能平衡。请参阅下面的示例,以便更好地理解我的意思。

         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);

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

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

我有一些关于可能的实现的想法,但我认为它是超级低效的(我必须在add()或remove()之后遍历整个树,并且只是用连接节点计算一个或者少了孩子。)

有关这种平衡和裸分支发生检测的更有效算法的任何想法吗?

非常感谢您提前。

1 个答案:

答案 0 :(得分:1)

长“裸”分支检测:

  • add():你只需要走x个节点。由于x是(假定小)常数,因此是O(1)

  • remove():向上查找,直到找到包含两个子节点或没有父节点的节点,或者达到x步。如果您没有达到x,请向下看,直到找到一个超过两个孩子(或没有)的人。不能超过x步,所以再次O(1)。