【问题标题】:Find predecessors in a BinaryTree in O(1)在 O(1) 中找到二叉树中的前辈
【发布时间】:2018-10-11 10:29:44
【问题描述】:

我在以下问题上遇到了问题

我有一个给定的二叉树(不一定是 BST)和两个指针 (x,y),我需要在 O(1) 复杂度中找出 X 是否是 Y 的前任,我可以添加任意数量的字段。

当我将下一个孩子插入到树中时,我正在考虑将每个前任添加为一个字段,但这样我如何在 O(1) 复杂度中搜索 X 是否是 Y 的前任。

【问题讨论】:

    标签: time-complexity binary-tree


    【解决方案1】:

    如果你使用节点,添加一个 unsigned int 字段,命名为L,从 1 开始,以 root 开头。

    当你递归插入时,取前一个节点的值并乘以 2,如果向右则加 1,如果向左则只需乘以 2。

    您将获得一棵 L 值的树,如下所示:

              1
             / \
            /   \ 
           /     \
          /       \
         10       11 
        /  \      / \
       /    \    /   \
     100   101 110   111
      \             /  \
     1001         1110  1111
       /
    10010
    

    祖先P 应该有一个值P.L,这样P.LC.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 多多少位。或者,CP低多少级。

    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.LC.L 只是您要检查的节点的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2021-03-10
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      相关资源
      最近更新 更多