我正在寻找一种简单的算法来查找二叉搜索树中的下一个最大元素(键),任何人都可以帮忙吗?
答案 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是最大的元素