zoukankan      html  css  js  c++  java
  • Leetcode题目437:路径总和III(递归-简单)

    题目描述:

    给定一个二叉树,它的每个结点都存放着一个整数值。

    找出路径和等于给定数值的路径总数。

    路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

    二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

    思路分析:题解来自(https://leetcode-cn.com/problems/path-sum-iii/solution/leetcode-437-path-sum-iii-by-li-xin-lei/

    路径的开头可以不是根节点,结束也可以不是叶子节点,是不是有点复杂?
    如果问题是这样:找出以根节点为开始,任意节点可作为结束,且路径上的节点和为 sum 的路径的个数;
    是不是前序遍历一遍二叉树就可以得到所有这样的路径?是的;
    如果这个问题解决了,那么原问题可以分解成多个这个问题;
    是不是和数线段是同一个问题,只不过线段变成了二叉树;
    在解决了以根节点开始的所有路径后,就要找以根节点的左孩子和右孩子开始的所有路径,三个节点构成了一个递归结构;

    代码实现:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
       /**
         * 求以 root 为根的二叉树,所有和为 sum 的路径;
         * 路径的开头不一定是 root,结尾也不一定是叶子节点;
         * @param root
         * @param sum
         * @return
         */
        public int pathSum(TreeNode root, int sum) {
    
            if (root == null) {
                return 0;
            }
    
            return paths(root, sum) 
                    + pathSum(root.left, sum) 
                    + pathSum(root.right, sum);
        }
    
        private int paths(TreeNode root, int sum) {
    
            if (root == null) {
                return 0;
            }
    
            int res = 0;
            if (root.val == sum) {
                res += 1;            
            }
            
            res += paths(root.left, sum - root.val);
            res += paths(root.right, sum - root.val);
            
            return res;
        }
    }
    
    时间复杂度 :O(n),n为树的节点个数;
    空间复杂度:O(h),h为树的高度;
  • 相关阅读:
    Python-02 可视化之tkinter介绍
    Python-01矩阵、数组和列表等的总结
    嵌入式文件IO实验
    Linux 学习
    linux 学习
    Linux学习
    Linux学习
    Linux 学习
    Linux 学习
    Linux 用户权限学习
  • 原文地址:https://www.cnblogs.com/ysw-go/p/12033847.html
Copyright © 2011-2022 走看看