我需要在任意键之后搜索下一个节点的实现方法。例如,BST具有密钥{0, 2, 4, 6, 8}
。对于关键1
,结果必须为2
,对于关键4
,结果必须为6
。
经过google和SO的一些研究后,我以这种方式实现它(C#-like pseudocode):
class TreeNode
{
int Key;
TreeNode Left;
TreeNode Right;
}
class Tree
{
TreeNode Root;
TreeNode FindNextNode(int key)
{
TreeNode node = Root;
TreeNode succ = null;
while (node != null) {
if (key >= node.Key) {
node = node.Right;
continue;
}
succ = node;
node = node.Left;
}
return succ;
}
}
一切似乎都很好甚至有效,但这样一个简单的实现让我觉得我已经错过了任何一件事。
我的实施是否正确?
答案 0 :(得分:1)
看了一会儿之后,最新版本的实现看起来是正确的。评论中提到了这个错误:
null
左右边框似乎也得到了正确处理。如果搜索键超出最大值,则返回null
。低于最小值的搜索也应该返回列表中的第一个元素。
我唯一担心的是没有continue
检查输入参数。也许一些输入参数检查会使这种实现更加健壮。
我也不想使用else
而是使用else。
以下是Kotlin强制执行非空搜索参数并使用continue
代替fun next(key: Key): Key? {
var node = root
var succ: Node<Key, Value>? = null
while (node != null) {
if (key >= node.key) {
node = node.right
}
else {
succ = node
node = node.left
}
}
return succ?.key
}
的此方法的一个版本:
var obj1 = {v: 1, rest: null}
var obj2 = {v: 2, rest: obj1}
var obj3 = {v: 3, rest: obj2}
var obj4 = {v: 4, rest: obj3}
var obj5 = {v: 5, rest: obj4}