Time complexity 在O(1)中的二进制树中查找前置项
我一直有以下问题的困扰 我有一个给定的二叉树(不一定是BST)和两个指针Time complexity 在O(1)中的二进制树中查找前置项,time-complexity,binary-tree,Time Complexity,Binary Tree,我一直有以下问题的困扰 我有一个给定的二叉树(不一定是BST)和两个指针(x,y),我需要找出x在O(1)复杂度中是否是y的前身,我可以添加任意多的字段 当我将下一个子元素插入到树中时,我正在考虑将每个前置元素添加为一个字段,但通过这种方式,我如何在O(1)复杂度中搜索X是否是Y的前置元素。如果使用节点,则添加一个无符号的int字段,称之为L,从1开始,以root开头 递归插入时,取上一个节点的值乘以2,如果向右,则加1;如果向左,则简单地乘以2 您将得到一个L值树,如下所示:
(x,y)
,我需要找出x在O(1)复杂度中是否是y的前身,我可以添加任意多的字段
当我将下一个子元素插入到树中时,我正在考虑将每个前置元素添加为一个字段,但通过这种方式,我如何在O(1)复杂度中搜索X是否是Y的前置元素。如果使用节点,则添加一个无符号的int字段,称之为
L
,从1开始,以root开头
递归插入时,取上一个节点的值乘以2,如果向右,则加1;如果向左,则简单地乘以2
您将得到一个L
值树,如下所示:
1
/ \
/ \
/ \
/ \
10 11
/ \ / \
/ \ / \
100 101 110 111
\ / \
1001 1110 1111
/
10010
祖先p
应该有一个值p.L
,这样p.L
是C.L
的子串,并且p.L
中的位数严格小于C.L
中的位数
base-10中树的L
值为:
1
/ \
/ \
/ \
/ \
2 3
/ \ / \
/ \ / \
4 5 6 7
\ / \
9 14 15
/
18
如果你有两个指针,如果你取log_2(L)
,你将得到该数字L
中的#位,如果你注意到,它代表你所在的树中的级别
因此,如果:
// Parent (ancestor) has equal or more bits?
if (log(P.L) >= log(C.L)) {
// parent is not an ancestor because it
// is either lower in tree, or at same level
}
如果该检查通过,从位(C)
中减去位(p)
,这将告诉您C.L比p.L.多多少位,或者C
比p
低多少级
int D = log(C.L) - log(P.L)
由于C
较低,我们计算C.L
值所做的一切就是将父级L
值乘以2(左移)若干次,如果我们将C移回右侧(除以2)D
次,则第一个D
位应该匹配
// Divide by 2, D times
int c = C.L >> D
// Is P.L a substring of C.L?
if (c == P.L) {
// P.L is a substring of C.L
// means P is an ancestor of C
}
// If we get here, C is below P in the tree, but C
// is not in a subtree of P because the first `D bits don't match`
本质上,我们使用整数作为字符串来跟踪插入路径,并使用位操作来检查C.L
是否是恒定时间内p.L
的子字符串
注意,如果您使用了数组,那么
p.L
和C.L
只是您要检查的节点的索引。谢谢您的回答!