了解Java递归代码以检查树是否是有效的二进制搜索树

时间:2016-02-10 23:32:22

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

我正在研究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);
}

我的实际树看起来像这样: enter image description here

上述功能的输出是:

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

现在,cananyone可以解释执行是如何进行的? 如何对函数进行嵌套(递归)调用? 我在理解递归函数调用时缺乏很多东西。如果有人能让我理解这段代码,我将能够解决许多与树有关的递归问题。寻求一些帮助。 非常感谢。

1 个答案:

答案 0 :(得分:1)

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

  1. 每个节点必须具有密钥或关联值。
  2. 每个节点最多必须有两个不同的子树,通常用左和右表示。
  3. 每个节点中的密钥必须大于存储在左子树中的所有密钥,并且小于右子树中的所有密钥。
  4. 具体来说,该函数验证树已满足第三个条件,假设前两个条件为真。此递归函数遍历Tree,直到它到达叶节点并确保每个子节点小于其父节点(如果它是左子节点)或大于其父节点(如果它是右子节点)。有两种基本情况(如果您不知道什么是基本情况,您需要阅读更多关于递归)。

    1. 函数已在叶节点处终止(节点为空)。
    2. 该功能使上述条件无效。
    3. 树遍历发生在这一行:

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

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