Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉搜索树的非递归floor方法_Java_Binary Search Tree - Fatal编程技术网

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