Time complexity 在O(1)中的二进制树中查找前置项

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值树,如下所示:

我一直有以下问题的困扰

我有一个给定的二叉树(不一定是BST)和两个指针
(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
只是您要检查的节点的索引。

谢谢您的回答!