LeetCode437路徑總和III
阿新 • • 發佈:2020-07-26
題目連結
https://leetcode-cn.com/problems/path-sum-iii/
題解
-
兩個DFS,兩個DFS作用不一樣
-
我寫的,其它人的題解大概也是這個思路
-
這道題是昨天那道題(點選檢視)的擴充套件,建議先看一下昨天那道題的題解二。
- 昨天那道題中的路徑是根節點到葉子節點之間的路徑
- 今天這道題中的路徑是任意節點到任意節點之間的路徑,只要求是向下的(即從父節點到子節點)
-
可以按照下面2步修改昨天那道題,即可得到今天這道題並求解
-
Step1:求根節點到任意節點(而非葉子節點)之間的路徑
處理這一差異,只需要將昨天那道題判斷語句中的葉子結點條件刪除即可,即只判斷路徑長度是否相等,不管是不是葉子結點
-
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/
歡迎討論和交流!