所以我正在用二叉搜索树进行一些实验,需要一些提示。
我想要实现的是自平衡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()之后遍历整个树,并且只是用连接节点计算一个或者少了孩子。)
有关这种平衡和裸分支发生检测的更有效算法的任何想法吗?
非常感谢您提前。
答案 0 :(得分:1)
长“裸”分支检测:
add():你只需要走x个节点。由于x是(假定小)常数,因此是O(1)
remove():向上查找,直到找到包含两个子节点或没有父节点的节点,或者达到x步。如果您没有达到x,请向下看,直到找到一个超过两个孩子(或没有)的人。不能超过x步,所以再次O(1)。