路径总和、二叉树的最小深度(力扣第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;
    }

 

posted @ 2020-08-19 09:39  有心有梦  阅读(233)  评论(0编辑  收藏  举报