二叉搜索树中的下一个最大元素

时间:2012-12-07 05:27:17

标签: java data-structures binary-search-tree

我正在寻找一种简单的算法来查找二叉搜索树中的下一个最大元素(键),任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

假设“下一个最大”是指当前节点所在的下一个最大节点......

从当前节点开始,向右移动一次。你已经去了一个更高价值的节点。然后,尽可能多地向左走。您已经以最低值节点结束,该节点仍然高于您开始的位置。

http://cs.lmu.edu/~ray/images/bstexample.png

实施例。从60开始,向右走一次,尽可能多地向左走。你最终在62岁。

尝试同样的事情41。你最终会在42岁。

编辑:

这应该有助于你的第二个案例。伪代码:

If (current.hasNoRightChild)
    testParent = current
    nextLargest = maxValueInTree
    While (testParent.hasParent)
        testParent = current.Parent
        If (testParent > current  && testParent < nextLargest)
            nextLargest = testParent
            While (testParent.hasLeftChild)
                testLeftChild = testParent.testLeftChild
                If (testLeftChild > current && testLeftChild < nextLargest)
                    nextLargest = testLeftChild
                End if
            End while
        End if
    End while
End if

不能保证没有错误,但一般的想法是你检查每个父母,慢慢地工作到树的顶部。在每个节点,您停止并查看它是否是“下一个最大”的候选者(即,它大于您开始的节点并且小于当前下一个最大的猜测)。在每个停靠点处,如果节点大于您启动的位置,则必须仅在左侧分支上沿着该节点的子树向下探索,并检查沿途的每个值。我认为应该这样做,但你应该用随机值大量测试它,以确保没有任何其他我们忽略的情况。

答案 1 :(得分:1)

案例1:右(x)非空 successor(x)=右边的最小值(x) 案例2:右(x)为空 上到树,直到当前节点是左子节点:successor(x)是当前节点的父节点 如果你不能走得更远(并且你到了根):x是最大的元素