vig*_*ora 5 java static binary-tree wrapper binary-search-tree
这是我在StackOverFlow上的第一个问题:我正在学习采访"Cracking the code interview"(第5版)的书,我正在解决下一个问题:
实现一个函数来检查二叉树是否是二叉搜索树(Q 4.5 pg 86).
在继续之前,我想提醒您二进制搜索树与简单二叉树之间的区别:
二进制搜索树强加了这样的条件:对于所有节点,左子节点小于或等于当前节点,其小于所有右节点.
因此,本书提供的解决方案之一是使用按顺序遍历扫描树,并在运行中检查我们访问的每个节点是否大于最后一个节点,并假设树不能具有重复值:
public static int last_printed = Integer.MIN_VALUE;
public static boolean checkBST(TreeNode n) {
if(n == null) return true;
// Check / recurse left
if (!checkBST(n.left)) return false;
// Check current
if (n.data <= last_printed) return false;
last_printed = n.data;
// Check / recurse right
if (!checkBST(n.right)) return false;
return true; // All good!
}
Run Code Online (Sandbox Code Playgroud)
现在,在这里一切都很好,但随后这本书引用:
如果您不喜欢使用静态变量,那么您可以调整此代码以使用整数的包装类,如下所示:
Class WrapInt {
public int value;
}
Run Code Online (Sandbox Code Playgroud)
在这里和其他网站上阅读包装类后,我无法得出结论,为什么以及如何在这里使用包装类而不是静态变量?
这是一种可以创建 WrapInt 实例并将其传递的机制。然后,您仅将该值公开给应该了解该值的代码,而不是公开可以从任何地方访问和更改的公共静态非最终变量。
之所以有包装类,是因为 Java 原语是按值传递的;传递一个 int 然后更新它不会将更改传播到系统的其余部分。
这看起来像这样:
public static boolean checkBST(TreeNode n) {
WrapInt counter = new WrapInt();
return checkBST(n, counter);
}
public static boolean checkBST(TreeNode n, WrapInt counter) {
if(n == null) return true;
// Check / recurse left
if (!checkBST(n.left, counter)) return false;
// Check current
if (n.data <= counter.value) return false;
counter.value = n.data;
// Check / recurse right
if (!checkBST(n.right, counter)) return false;
return true; // All good!
}
Run Code Online (Sandbox Code Playgroud)