路径总和、二叉树的最小深度(力扣第112、111题)
题目:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
返回 true
, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2
。
分析:
题目是求是否存在某一条从根节点到叶子节点的路径,这个路径上的所有节点的值相加等于目标和。从根节点到叶子节点,本质就是树的遍历,那么可以定义一个变量,用于记录从根节点开始遍历路径上的所有节点的和,判断当遇到叶子节点的时候是否和目标和相等,如果相等,那么就将记录最终结果的不二类型的成员变量置为true,否则返回继续遍历。
代码:
private boolean isTargrt = false; public boolean hasPathSum(TreeNode root, int sum) { if (root == null){ return false; } traversalTree(root,0,sum); return isTargrt; } private void traversalTree(TreeNode root,int curSum,int sum){ if (root == null){ return; } curSum += root.val; if (root.right == null && root.left == null){ if (curSum == sum){ isTargrt = true; } return; } traversalTree(root.left,curSum,sum); traversalTree(root.right,curSum,sum); }
题目:二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回它的最小深度 2
分析:
求最小深度和求树的高度正好是相反的,求树的高度是从根节点到最远叶子节点的最长路径上的节点数,而最小深度是从根节点到最近叶子节点的最短路径上的节点数。都是与树的深度计算相关,但是一个是最短的,一个是最长的。求树的高度是通过计算左右子树的最大深度然后加1得出最终答案的,那么本题可以通过计算左右子树最小深度然后加1得出最终的答案。
不过这里需要注意的是,因为我们要求的最小的深度,所以返回值一定是取左右子树最小深度的最小值然后加1,但是可能存在某个子树为null的情况,比如某个节点,其只有左子树,而没有右子树,那么右子树的最小深度一定是0,而左子树的最小深度肯定大于0,按照上面的返回值计算方式,最终返回的右子树的最小深度值加1,即1,但是这是不正确的,为什么呢?因为右子树根本就没有叶子节点,右子树不存在,也就不可能有叶子节点,叶子节点只可能在左子树才有,所以需要再专门有个讨论,就是访问到某个节点的时候,计算完这个节点的子树的最小深度,判断两个子树是否最小深度为0,如果有为0,那就直接返回不为0的子树的最小深度值加1。这就是与求高度不同的地方。特别注意!!!
代码:
public int minDepth(TreeNode root) { if (root == null){ return 0; } int left_length = minDepth(root.left); int right_length = minDepth(root.right); if (left_length == 0 || right_length == 0){ return left_length + right_length + 1; } return Math.min(left_length,right_length)+1; }