文章目录

  • 步骤
  • 我在大包里面新建了一个类 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 注释掉这两个类的代码,这是为了不对下一题造成影响