Java 二叉搜索树的非递归floor方法
我一直在尝试让它工作,但尽管它对大多数输入有效,但有时它会给出错误的输出。我花了一些时间调试代码,问题似乎是当我得到一个比根小但比根下的左节点大的节点时Java 二叉搜索树的非递归floor方法,java,binary-search-tree,Java,Binary Search Tree,我一直在尝试让它工作,但尽管它对大多数输入有效,但有时它会给出错误的输出。我花了一些时间调试代码,问题似乎是当我得到一个比根小但比根下的左节点大的节点时 如果右子树中没有节点是该键的楼层节点,我如何遍历右子树并仍然返回右键?回想一下,如果递归地执行任何操作,它可以转换为*迭代 让我们考虑一个格式良好的BST,它应该是小于或等于树中键的最小元素。我们所要做的就是穿过这棵树去得到它 让我们递归地实现它,这样我们就可以梳理出迭代和递归之间的一些重要推论 // Assuming non-null roo
如果右子树中没有节点是该键的楼层节点,我如何遍历右子树并仍然返回右键?回想一下,如果递归地执行任何操作,它可以转换为*迭代
让我们考虑一个格式良好的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;
}
}
使用12键:
- 与9相比。我们更大。将9存储在最低的节点变量recurse right中
- 与14相比。我们比较小,但是我们没有一个左撇子。我们将值14与9进行比较,9更小,因此我们返回带有9的节点
- 起点:非空节点
- 有条件支票:
key.compareTo(root.getKey())我不明白这个算法应该做什么?它应该是BSTs上floor()操作的非递归实现。因此,您希望准确地获取具有最大键的节点。这就是我需要的。谢谢你的解释。我想出来了,但这有助于我更好地理解这一点。
9 / \ 3 14 / \ 1 2