在任何键之后在BST中找到后继节点

时间:2018-01-27 18:49:29

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

我需要在任意键之后搜索下一个节点的实现方法。例如,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;
    }
}

一切似乎都很好甚至有效,但这样一个简单的实现让我觉得我已经错过了任何一件事。

我的实施是否正确?

更新:供讨论的图片 enter image description here

1 个答案:

答案 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}