【发布时间】:2018-10-11 10:29:44
【问题描述】:
我在以下问题上遇到了问题
我有一个给定的二叉树(不一定是 BST)和两个指针 (x,y),我需要在 O(1) 复杂度中找出 X 是否是 Y 的前任,我可以添加任意数量的字段。
当我将下一个孩子插入到树中时,我正在考虑将每个前任添加为一个字段,但这样我如何在 O(1) 复杂度中搜索 X 是否是 Y 的前任。
【问题讨论】:
标签: time-complexity binary-tree
我在以下问题上遇到了问题
我有一个给定的二叉树(不一定是 BST)和两个指针 (x,y),我需要在 O(1) 复杂度中找出 X 是否是 Y 的前任,我可以添加任意数量的字段。
当我将下一个孩子插入到树中时,我正在考虑将每个前任添加为一个字段,但这样我如何在 O(1) 复杂度中搜索 X 是否是 Y 的前任。
【问题讨论】:
标签: time-complexity binary-tree
如果你使用节点,添加一个 unsigned 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 中的位数。
以 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
}
如果检查通过,从bits(C) 中减去bits(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 只是您要检查的节点的索引。
【讨论】: