二叉树访谈:实施跟进操作

时间:2013-11-29 07:32:46

标签: c++ algorithm binary-search-tree

我被要求为每个节点v实施一个包含跟踪操作的二叉搜索树 - 复杂性应为O(1)。以下操作应返回节点ww > v) 我建议在O(log(n))中执行此操作,但他们希望O(1) 更新。它应该是下一个更大的节点

4 个答案:

答案 0 :(得分:5)

只保留树的最大元素,并始终为节点v<最大。

答案 1 :(得分:0)

如果您将指针存储到“下一个节点”(使用O(log(n)算法),则可以获得O(1),前提是您可以这样做。

答案 2 :(得分:0)

怎么样:

int tree[N];

size_t follow(size_t v) {
    // First try the right child
    size_t w = v * 2 + 1;
    if(w >= N) {
        // Otherwise right sibling
        w = v + 1;
        if(w >= N) {
            // Finally right parent
            w = (v - 1) / 2 + 1;
        }
    }
    return w;
}

其中 tree 是数组形式的完整二叉树,v / w表示为从零开始的索引。

答案 3 :(得分:0)

一个想法是在每个节点上只有一个next指针。

您可以在插入或移除后O(height)更新这些指针(self-balancing BST O(height)O(log n)),只要插入或移除需要,所以它不会增加时间复杂性。

或者,除previous指针外,您还可以使用next指针。如果这样做,您可以在O(1)

中更新这些指针

显然,在任何一种情况下,如果你有一个节点,你也有next指针,你可以在O(1)中得到这个值。

<强>伪代码

对于仅next指针,在插入之后,您将执行:

if inserted as a right child:
   newNode.next = parent.next
   parent.next = newNode
else // left child
   predecessor(newNode)

对于nextprevious指针:

if inserted as a right child:
   parent.next.previous = newNode
   newNode.next = parent.next
   parent.next = newNode
else // left child
   parent.previous.next = newNode
   newNode.previous = parent.previous
   parent.previous = newNode

(还需要进行一些null次检查。)