这是我在StackOverFlow上遇到的第一个问题:
我正在借助“破解代码面试”(第5版)这本书来研究面试,
我正在解决下一个问题:
在继续之前,我只想提醒您一个二叉搜索树与一个简单的二叉树之间的区别:
因此,本书提供的解决方案之一是按顺序遍历树,并动态检查我们访问的每个节点是否都大于最后一个节点,并且假定树不能有重复的值:
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!
}
现在,这里一切都很好,但是书中引述了以下内容:
Class WrapInt {
public int value;
}
在遍历这里和其他网站的包装器类之后,我无法得出结论,为什么以及为什么我应该在这里使用包装器类而不是静态变量?
最佳答案
通过这种机制,您可以创建WrapInt实例,并将其传递给周围。然后,仅将值公开给应该知道该值的代码,而不是可以从任何地方访问和更改的公共(public)静态非最终变量。
之所以拥有包装器类,是因为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!
}
关于java - 使用包装器类而不是静态变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29770749/