java - 对二叉树的叶子进行升序排序时遇到问题
问题描述
所以最初的问题是编写方法 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);
}
}
解决方案
在没有全局变量的情况下,您实际上没有办法通过比较来遍历叶子。这可以通过引用传递来完成,但 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 中,您可以看到我的代码具有带有私有访问修饰符的方法。您的静态变量也是如此。养成习惯,让事情变得私密,然后根据需要扩展它们的修饰符。
推荐阅读
- html - 无法在 chrome 中看到视频,也无法调整其大小
- tfs - VSTS - 命令行上的登录凭据
- mongodb - 我想检查 MongoDB 中的不同条件
- python - 如何正确使用文件资源管理器浏览功能 - PySimpleGUI
- c# - 新的应用程序最佳实践仅 DateTimeOffset 或与 UTC datetime2 组合
- python - 如何使用 Python Flask /flask_mail 发送带附件的电子邮件
- c# - 当您尝试使用 PIV 卡的私钥和全局密码进行签名时,RSACryptoServiceProvider 是否有效?
- android - 为 android 交叉编译 openconnect-8.08 时出错
- c# - 与 DataAccess.Client.OracleConnection 共享 ManagedDataAccess.Client.OracleConnection 连接/会话/事务
- python - 如何删除/跳过
Python中的对象