文章目录
- 步骤
- 我在大包里面新建了一个类 TreeNode 这样所有二叉树的题目都能识别到TreeNode这个类(以后不需要重复写了)
- 把 main方法以及其他用到的函数粘贴到 class Solution 里面
- 然后从力扣调试界面 粘贴stdin的输入样例即可(必须格式一模一样)
- 删除之前做的其他题目中的 class Solution 即可
- 这道题解决了之后,就把Solution类注释掉,以防止解下一题的时候报重复类Solution错误
- 这样就大功告成
- 下面附上这一次成功的全部代码
- 下面是 LeetcodeAssistant 插件创建的本地代码,也能给我们一些启发
- 代码:
- 这给我们 提供了另一种思路
- 我们只需要把力扣官网playground调试界面拷贝下来的代码,把其中public class MainClass 这个类前面的 public 删掉即可, 然后找到 class MainClass类,在这个类里面的任意位置右键单击然后点击调试main方法(再此之前先打上断点),最后在控制台输入 从官网上拷贝下来的stdin测试用例即可
- 当你做完这题,把class Solution 类 和 class MainClass类 用Ctrl +shift + 减号 折叠所有展开的代码 然后 ctrl + shift + A 注释掉这两个类的代码,这是为了不对下一题造成影响
步骤
我在大包里面新建了一个类 TreeNode 这样所有二叉树的题目都能识别到TreeNode这个类(以后不需要重复写了)
把 main方法以及其他用到的函数粘贴到 class Solution 里面
然后从力扣调试界面 粘贴stdin的输入样例即可(必须格式一模一样)
删除之前做的其他题目中的 class Solution 即可
这道题解决了之后,就把Solution类注释掉,以防止解下一题的时候报重复类Solution错误
这样就大功告成
下面附上这一次成功的全部代码
package leetcode.editor.cn;//给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
//
//
//
// 示例 :
//给定二叉树
//
// 1
// / \
// 2 3
// / \
// 4 5
//
//
// 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
//
//
//
// 注意:两结点之间的路径长度是以它们之间边的数目表示。
// Related Topics 树 深度优先搜索 二叉树 👍 1013 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
// * }
*/
class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null){ //注意边界条件的判断
return 0;
}
dfs(root);
return max;
}
public int dfs(TreeNode root){
int leftSize = root.left == null ? 0 : dfs( root.left ) + 1;
int rightSize = root.right == null ? 0 : dfs( root.right ) + 1;
max = Math.max( leftSize + rightSize, max); //在过程中更新最大值
return Math.max(leftSize, rightSize); // 这一步太妙了,你偷偷更新max, 我当看不见, 然后我该返回什么,就返回什么
}
public static TreeNode stringToTreeNode(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return null;
}
String[] parts = input.split(",");
String item = parts[0];
TreeNode root = new TreeNode(Integer.parseInt(item));
Queue<TreeNode> nodeQueue = new LinkedList<>();
nodeQueue.add(root);
int index = 1;
while(!nodeQueue.isEmpty()) {
TreeNode node = nodeQueue.remove();
if (index == parts.length) {
break;
}
item = parts[index++];
item = item.trim();
if (!item.equals("null")) {
int leftNumber = Integer.parseInt(item);
node.left = new TreeNode(leftNumber);
nodeQueue.add(node.left);
}
if (index == parts.length) {
break;
}
item = parts[index++];
item = item.trim();
if (!item.equals("null")) {
int rightNumber = Integer.parseInt(item);
node.right = new TreeNode(rightNumber);
nodeQueue.add(node.right);
}
}
return root;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
TreeNode root = stringToTreeNode(line);
int ret = new Solution().diameterOfBinaryTree(root);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
下面是 LeetcodeAssistant 插件创建的本地代码,也能给我们一些启发
代码:
package leetcode.editor.cn;给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
Related Topics 树 深度优先搜索 二叉树 👍 1013 👎 0
//
//leetcode submit region begin(Prohibit modification and deletion)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null){ //注意边界条件的判断
return 0;
}
dfs(root);
return max;
}
public int dfs(TreeNode root){
int leftSize = root.left == null ? 0 : dfs( root.left ) + 1;
int rightSize = root.right == null ? 0 : dfs( root.right ) + 1;
max = Math.max( leftSize + rightSize, max); //在过程中更新最大值
return Math.max(leftSize, rightSize); // 这一步太妙了,你偷偷更新max, 我当看不见, 然后我该返回什么,就返回什么
}
}
class Main {
public static void main(String[] args) {
TreeNode root = parseTreeNode(new Integer[]{1, 3, null, null, 2});
new Solution().diameterOfBinaryTree(root);
}
private static TreeNode parseTreeNode(Integer[] values) {
TreeNode root = null;
java.util.LinkedList<TreeNode> nodes = new java.util.LinkedList<TreeNode>();
int i = 0;
while (i < values.length) {
if (i == 0) {
root = new TreeNode(values[i]);
i += 1;
nodes.addLast(root);
continue;
}
TreeNode parent = nodes.pop();
if (values[i] != null) {
TreeNode left = new TreeNode(values[i]);
parent.left = left;
nodes.addLast(left);
}
if (i + 1 < values.length && values[i + 1] != null) {
TreeNode right = new TreeNode(values[i + 1]);
parent.right = right;
nodes.addLast(right);
}
i += 2;
}
return root;
}
}
//leetcode submit region end(Prohibit modification and deletion)
这给我们 提供了另一种思路
我们只需要把力扣官网playground调试界面拷贝下来的代码,把其中public class MainClass 这个类前面的 public 删掉即可, 然后找到 class MainClass类,在这个类里面的任意位置右键单击然后点击调试main方法(再此之前先打上断点),最后在控制台输入 从官网上拷贝下来的stdin测试用例即可
当你做完这题,把class Solution 类 和 class MainClass类 用Ctrl +shift + 减号 折叠所有展开的代码 然后 ctrl + shift + A 注释掉这两个类的代码,这是为了不对下一题造成影响