我正在研究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
现在,cananyone可以解释执行是如何进行的? 如何对函数进行嵌套(递归)调用? 我在理解递归函数调用时缺乏很多东西。如果有人能让我理解这段代码,我将能够解决许多与树有关的递归问题。寻求一些帮助。 非常感谢。
答案 0 :(得分:1)
为了使树成为二叉搜索树(BST),它必须满足这些条件。
具体来说,该函数验证树已满足第三个条件,假设前两个条件为真。此递归函数遍历Tree,直到它到达叶节点并确保每个子节点小于其父节点(如果它是左子节点)或大于其父节点(如果它是右子节点)。有两种基本情况(如果您不知道什么是基本情况,您需要阅读更多关于递归)。
树遍历发生在这一行:
return isValidBST(focusNode.leftChild, min, focusNode.key) && isValidBST(focusNode.rightChild, focusNode.key, max);
每个节点必须验证其左侧和右侧子树,然后才能认为节点本身有效。