1. 程式人生 > 實用技巧 >LeetCode437路徑總和III

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/

歡迎討論和交流!