二叉树访谈:实现跟随操作

Binary tree interview: implement follow operation

本文关键字:跟随 操作 实现 访谈 二叉树      更新时间:2023-10-16

我被要求为每个节点v实现一个带有follow操作的二进制搜索树,复杂度应该是O(1)。以下操作应返回一个节点ww > v
我提议在O(log(n))中做,但他们想要O(1)上升它应该是下一个更大的节点

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

如果存储指向"下一个节点"的指针(使用O(log(n)算法),则可以获得O(1),前提是允许这样做。

怎么样:

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表示为基于零的索引。

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

您可以在插入或移除后更新O(height)中的这些指针(O(height)是自平衡BST的O(log n)),这与插入或移除所需的时间一样长,因此不会增加时间复杂性。

或者,除了next指针之外,还可以有一个previous指针。如果您这样做,您可以在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检查)。