我被要求为每个节点v
实施一个包含跟踪操作的二叉搜索树 - 复杂性应为O(1)
。以下操作应返回节点w
(w > v
)
我建议在O(log(n))
中执行此操作,但他们希望O(1)
更新。它应该是下一个更大的节点
答案 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)
对于next
和previous
指针:
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
次检查。)