二叉树访谈:实现跟随操作
Binary tree interview: implement follow operation
我被要求为每个节点v
实现一个带有follow操作的二进制搜索树,复杂度应该是O(1)
。以下操作应返回一个节点w
(w > 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)
对于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
检查)。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 跟随整数索引列表的自定义类迭代器
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 像union_这样的 Boost.Geometry 操作如何处理浮点类型的基本不精确性?
- 二叉树访谈:实现跟随操作