• 路径总和、二叉树的最小深度(力扣第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;
        }
  • 相关阅读:
    关于防盗链
    原生php登陆注册
    thinkPHP的D方法和M方法用法和区别
    Python中类与对象的关系
    解决_CRT_SECURE_NO_WARNINGS 警告
    骨头汤、豆浆、海带都不能补钙,最补钙的食物是它
    蘑菇鸡蛋汤
    CString和string在unicode与非unicode下的相互转换(转)
    【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)
    LINK : fatal error LNK1104: 无法打开文件“mfc71.lib”(转)
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13492856.html
Copyright © 2020-2023  润新知