【leetcode刷题笔记】:437. 路径总和 III

二叉树中等题

路径总和 III

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

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

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

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
【leetcode刷题笔记】:437. 路径总和 III_第1张图片
思路:

  • 每个结点往下找路径为sum的最后结点,然后+1;
  • 找到最后结点后,还需要继续往下找,可能出现往下的几个结点的路径合为0的情况
  • 然后递归找每个结点;

解决:双重递归

  • 一个递归找当前结点为起始点的所有路径为sum的,一直到叶子节点
  • 另一个递归找所有的结点的满足路径长度的数量

代码:

class Solution {
public:
    int rootpath(TreeNode* root, int sum){   //当前点的路径长度为sum的数目
	    int count=0;
	    if(root==NULL)
	        return 0;
	    //有为sum的就加1,继续往下找,直到为空
	    if(root->val == sum)
	        count++;
	    //每个跟结点的值算在sum里,然后递归该结点下面的结点,算sum-val的
	    count += rootpath(root->left,sum-root->val);//计算以当前结点为起始的路径,从左右两边算剩下的路径长度
	    count += rootpath(root->right,sum-root->val);
	    return count;
}
    int pathSum(TreeNode* root, int sum) {
        int count=0;
        if(root!=NULL){
            count += rootpath(root,sum);
            count += pathSum(root->left,sum);
            count += pathSum(root->right,sum);
        }
        return count;
    }
};

【leetcode刷题笔记】:437. 路径总和 III_第2张图片

个人总结:
刷到了二叉树的编程题后,感觉二叉树只要能用递归,基本上不需要考虑特别多的边界条件,只不过一般递归如何结束要想好久。所以平时只要多看看递归,看看别人的递归如何写的,多加掌握,也就好写了。

递归的总结:

  • 把整颗树看成只有三个结点:左孩子,右孩子,根节点
  • 先递归实现左右子树,只考虑当前做什么,不用考虑下次应该做什么
    比如计算高度的时候,分别实现左右孩子的高度,那左孩子的高度不就是它的孩子的高度+1,那它的孩子的高度怎么算,不用去考虑它,使用递归实现即可。
  • 再来考虑递归结束条件,一般是遇到null(到达叶子节点)啊,返回0或者返回1什么的
  • 最后考虑每次调用应该返回什么(这点感觉比较难)

你可能感兴趣的:(leetcode刷题笔记)