LeetCode437.路径总和III(C++实现)

题目描述

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

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

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

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

示例:

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

      10
     /  \
    5   -3
   / \    \
  3   2   11
 / \   \
3  -2   1

返回 3。和等于 8 的路径有:

1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

解题思路

采用深度优先遍历的思想,使用递归的方法不断的搜索从某棵子树根节点开始符合要求的路径。具体说来:

第一步:从根节点10开始向下深度遍历,搜索以10开头的路径,有没有路径和等于sum的,如果有则计数值加一,然后继续向下遍历,因为可能存在更长的路径的和也等于sum,比如:

LeetCode437.路径总和III(C++实现)_第1张图片

这棵树,假如sum=8,那么10->-2 是一个符合要求的路径, 10->-2->-5->5也是。

第二步:第一步开始的一次遍历,是以根节点10开头的路径,那么现在我们要找出所有的可能路径,那么很显然要递归,接着从根节点的左右子树根节点开始。就是搜索以5这个节点为根节点的子树的所有路径总数,再搜索以-3为根节点的子树的所有路径总数。

第三步:重复第二步的递归,以此类推。

实现方法:

我们首先要实现一个利用深度优先遍历求某个根节点开始的子树的所有符合要求的路径总数的函数dfs;然后每次递归就是求以某个根节点开始的dfs返回的路径数目+递归调用左孩子的返回值+递归调用右孩子的返回值。

代码详解

class Solution {
public:
    int dfs(TreeNode* T, int sum)
    {//深度优先遍历,搜索某子树的所有可能路径
        int res = 0;
        if(T == NULL)
            return res;//节点为空时返回0
        if(sum == T->val)
            res++;//此时说明到该节点的路径是符合要求的
        res += dfs(T->left, sum - T->val);//目前的路径数目+遍历左子树得到的路径数目;
        res += dfs(T->right, sum - T->val);
        return res;
    }

    int pathSum(TreeNode* root, int sum) {
        if(NULL == root)
            return 0;
        return dfs(root, sum) + pathSum(root->left, sum) + pathSum(root->right, sum);
    }//每次递归做三件事:搜索节点T开始的子树的所有路径、递归到左子树重复、递归到右子树重复
};

 

你可能感兴趣的:(刷题总结)