二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:3
示例 2:
输入:root = [1,null,2] 输出:2
解题思路:
首先构建二叉树:接收用户输入的节点值字符串,按空格分割成数组,若为空或首个是 “null” 则返回空树。否则用首个值创建根节点入队列,从第二个值开始循环,每次取队列节点,按顺序依值构建左右子树节点(非 “null” 时创建并加入队列),最后返回根节点完成树构建。然后再使用两个方法:isSymmetric 方法:先看根节点,为空则树对称返回 true,不为空就调 isMirror 方法判断左右子树是否镜像对称。isMirror 方法:有两个终止条件,左右子树都为空返回 true,有且仅有一个为空返回 false;正常情况需当前节点值相等且左子树左与右子树右、左子树右与右子树左分别对称(递归判断),都满足才返回 true,以此判断整树是否轴对称。
具体代码:
import java.util.Scanner; // 定义二叉树节点类 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } class Solution { // 计算二叉树最大深度的方法 public int maxDepth(TreeNode root) { if (root == null) { return 0; } // 递归计算左子树深度 int leftDepth = maxDepth(root.left); // 递归计算右子树深度 int rightDepth = maxDepth(root.right); // 整棵树的深度 = 左右子树深度较大值 + 1(根节点这一层) return Math.max(leftDepth, rightDepth) + 1; } } public class shenDu { public static TreeNode buildTree() { Scanner scanner = new Scanner(System.in); System.out.println("请按层序遍历顺序输入二叉树节点值(使用null表示空节点),节点值之间用空格隔开,输入完成后按回车键:"); String input = scanner.nextLine().trim(); String[] values = input.split(" "); if (values.length == 0 || values[0].equals("null")) { return null; } TreeNode root = new TreeNode(Integer.parseInt(values[0])); int index = 1; while (index < values.length) { TreeNode node = findNode(root, values, index); index += 2; } return root; } private static TreeNode findNode(TreeNode parent, String[] values, int index) { if (index >= values.length || values[index].equals("null")) { return null; } TreeNode node = new TreeNode(Integer.parseInt(values[index])); parent.left = node; if (index + 1 < values.length &&!values[index + 1].equals("null")) { TreeNode rightNode = new TreeNode(Integer.parseInt(values[index + 1])); node.right = rightNode; } return node; } public static void main(String[] args) { TreeNode root = buildTree(); Solution solution = new Solution(); System.out.println("该二叉树的最大深度为: " + solution.maxDepth(root)); } }
运行截图: