因此,最初的问题是编写方法chechkLeaves(),如果树的叶子按升序排序,则应返回true,否则返回false。您可以假定所有内部节点的数据均为空。您会发现为该问题定义其他递归帮助器方法很有用。
编辑:我的代码正在运行,但是如何修改代码,以便将val作为参数而不是全局变量传递?
static int val = 0;
static public boolean checkLeaves(Node root) {
// int val = 0;
if(root.data != 0 ) {
if(root.data > val) {
val = root.data;
return true;
} else {
return false;
}
} else {
return checkLeaves(root.left) && checkLeaves(root.right);
}
}
答案 0 :(得分:1)
在没有全局变量比较的情况下,您真正没有办法进行叶子的遍历。这可以通过按引用传递来完成,但是Java没有这种功能。因此,您有两个选择:
选项1)。请坚持使用此静态变量。
选项2),将val
作为数组的参数,例如:
private static public boolean checkLeaves(Node root, int[] val) {
if (root.data != 0) {
if (root.data > val[0]) {
val[0] = root.data;
return true;
} else {
return false;
}
} else {
return checkLeaves(root.left, val) && checkLeaves(root.right, val);
}
}
并称之为:
checkLeaves(root, new int[] { Integer.MIN_VALUE });
通过将其设置为数组,您可以模拟“按引用传递”行为。即,通过参考原始值来更新变量的原始值。 Java中的所有内容都是按值传递的,因此变量的值将传递给参数,而不是对其的引用。
我建议您命名变量以更具描述性。例如,您可以用val
代替previousLeafValue
或类似的名称。
此外,一个好的做法是使所有内容尽可能“私有”。在选项2中,您可以看到我的代码具有带私有访问修饰符的方法。您的静态变量也是如此。养成按习惯使事物私密的习惯,然后根据需要扩展其修饰符。