LeetCode437路径总和III

题目链接

https://leetcode-cn.com/problems/path-sum-iii/

题解

  • 两个DFS,两个DFS作用不一样

  • 我写的,其它人的题解大概也是这个思路

  • 这道题是昨天那道题(点击查看)的扩展,建议先看一下昨天那道题的题解二。

    • 昨天那道题中的路径是根节点到叶子节点之间的路径
    • 今天这道题中的路径是任意节点到任意节点之间的路径,只要求是向下的(即从父节点到子节点)
  • 可以按照下面2步修改昨天那道题,即可得到今天这道题并求解

    1. Step1:求根节点到任意节点(而非叶子节点)之间的路径

      处理这一差异,只需要将昨天那道题判断语句中的叶子结点条件删除即可,即只判断路径长度是否相等,不管是不是叶子结点

    2. Step2:求任意结点(而非根节点)到任意节点之间的路径

      处理这一差异,只需基于昨天那道题的解法,再套一层递归,即不止求根节点,还要递归求解其左右子树并将路径数相加

// Problem: LeetCode 437
// URL: https://leetcode-cn.com/problems/path-sum-iii/
// Tags: Tree Recursion DFS
// Difficulty: Medium

#include <iostream>
using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):val(x),left(nullptr),right(nullptr){}
};

class Solution{
private:
    // Step1:搜索当前子树中节点到根节点之间距离等于sum的路径数
    int dfs(TreeNode* root, int sum){
        if (root == nullptr)
            return 0;
        int count = 0;
        if (root->val == sum)
            count++;
        return count + dfs(root->left, sum - root->val) + dfs(root->right, sum - root->val);
    }

public:
    int pathSum(TreeNode* root, int sum) {
        if(root==nullptr)
            return 0;
        // Step2:结果为:以当前节点为根节点时的路径数+以左子节点为根节点时的路径数+以右子节点为根节点时的路径数;
        return dfs(root, sum) + pathSum(root->left, sum) + pathSum(root->right, sum);
    }
};

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


猜你喜欢

转载自www.cnblogs.com/chouxianyu/p/13380219.html