【问题标题】:Understanding Java Recursion code to check if tree is a valid Binary Search Tree了解 Java 递归代码以检查树是否是有效的二叉搜索树
【发布时间】:2016-02-10 23:32:21
【问题描述】:

我正在研究 Java 中的数据结构(目前是树)。 我有一个函数可以确定一棵树是否是有效的 BST。 该功能正常运行,但我无法理解它是如何运行的。 函数如下:

//call from Main method 
boolean isBST = theTree.isValidBST(theTree.root);
System.out.println("isBST??" +isBST);

//actual method body
public boolean isValidBST(Node root) {
    return isValidBST(root, Integer.MIN_VALUE, Integer.MAX_VALUE);    
}

public boolean isValidBST(Node focusNode, int min, int max){
    if(focusNode==null) 
        return true;
     System.out.println("Comparing "+focusNode.key+ " with "+min+" min value ");
     System.out.println("Comparing "+focusNode.key+ " with "+max+" max value ");
        if(focusNode.key <= min || focusNode.key >= max)
            return false;

    return isValidBST(focusNode.leftChild, min, focusNode.key) && isValidBST(focusNode.rightChild, focusNode.key, max);
}

我的实际树是这样的:

上述函数的输出是:

Comparing 50 with -2147483648 min value 
Comparing 50 with 2147483647 max value 
Comparing 25 with -2147483648 min value 
Comparing 25 with 50 max value 
Comparing 15 with -2147483648 min value 
Comparing 15 with 25 max value 
Comparing 30 with 25 min value 
Comparing 30 with 50 max value 
Comparing 75 with 50 min value 
Comparing 75 with 2147483647 max value 
Comparing 85 with 75 min value 
Comparing 85 with 2147483647 max value 
isBST??true

现在谁能解释一下这里的执行过程是怎样的? 如何对函数进行嵌套(递归)调用? 我缺乏对递归函数调用的理解。如果有人能让我理解这段代码,我将能够解决许多与树相关的递归问题。寻找一些帮助。 非常感谢。

【问题讨论】:

  • 这是一个相当广泛的问题......
  • 你是在问递归函数是如何工作的吗?
  • 你能说得更具体点吗?该代码的哪一部分让您感到困惑?你了解函数调用的工作原理吗?
  • @RileyCarney 范围很广,但是如果一个好的java deeloper理解它,他可以用简短的段落解释它的工作。
  • @SpencerBrett 是的,我确实知道非递归函数调用工作。你能解释一下最后一条语句的执行过程中断吗?isValidBST(focusNode.leftChild, min, focusNode.key) && isValidBST(focusNode.rightChild, focusNode.key, max);

标签: java debugging recursion tree binary-search-tree


【解决方案1】:

为了使树成为二叉搜索树 (BST),它必须满足这些条件。

  1. 每个节点都必须有一个键或关联值。
  2. 每个节点最多必须有两个可区分的子树,通常表示为左和右。
  3. 每个节点中的键必须大于左子树中存储的所有键,并且小于右子树中存储的所有键。

具体来说,这个函数正在验证树是否满足第三个条件,前提是前两个条件为真。这个递归函数遍历树,直到它碰到一个叶节点,并确保每个子节点要么小于其父节点(如果它是左子节点),要么大于其父节点(如果它是右子节点)。有两种基本情况(如果你不知道基本情况是什么,你需要阅读更多关于递归的内容)。

  1. 函数已在叶节点处终止(该节点为空)。
  2. 函数已使上述条件无效。

树的遍历发生在这一行:

return isValidBST(focusNode.leftChild, min, focusNode.key) && isValidBST(focusNode.rightChild, focusNode.key, max);

每个节点必须先验证其左右子树,然后才能认为节点本身有效。

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2018-08-10
    • 2016-03-06
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多