我一直试图让它工作但是虽然它适用于大多数输入,但它有时会产生错误的输出。我花了一些时间调试代码,似乎问题是当我得到一个小于root但比root下的左边节点大的Node。
如果右子树中没有节点是该键的楼层节点,我如何遍历正确的子树并仍然返回右键?
答案 0 :(得分:1)
回想一下,如果你以递归方式做任何事情,它可以被转换为*迭代。
让我们考虑使用格式良好的BST,它应该只是小于或等于树中键的最小元素。我们所要做的就是遍历树来获得它。
让我们递归地实现它,这样我们就可以在迭代和递归之间梳理一些重要的推论。
// Assuming non-null root node with method declaration
private Node floor(Node root, Key key, Node lowestNode) {
if(key.compareTo(root.getKey()) <= 0) {
if(root.getLeft() != null) {
return floor(root.getLeft(), key, lowestNode);
} else {
return root.compareTo(lowestNode) < 0 ? root : lowestNode;
}
} else {
if(root.getRight() != null) {
lowestRightNode.add(root);
return floor(root.getRight(), key, lowestNode);
} else {
return lowestNode;
}
}
让我们走过成功的条件。
示例可能如下所示:
9
/ \
3 14
/ \
1 2
使用12键:
如果我们想将其转换为迭代,那么请考虑您的起点,条件检查和增量步骤。
key.compareTo(root.getKey()) <= 0
root.getLeft() != null
root.compareTo(lowestRightNode) < 0 ? root : lowestRightNode
root.getRight() != null
return lowestRightNode
密切关注您的延续条件,以及您必须做的其他工作,以跟踪您目前所见的最低节点(仅限于右侧,即) 。
*:当然,有些递归操作比其他操作更难以转换痛苦。