437路徑總和 III(雙重遞迴)
阿新 • • 發佈:2021-01-08
1、題目描述
給定一個二叉樹,它的每個結點都存放著一個整數值。
找出路徑和等於給定數值的路徑總數。
路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。
二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。
2、示例
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、題解
基本思想:雙重遞迴,第一重遞迴dfs遍歷root中的每一個節點,第二重遞迴path以該節點為起始點不斷往下求和節點值,如果求和等於target,res+=1。
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<unordered_map> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; #define inf 9999 void Init_TreeNode(TreeNode** T, vector<int>& vec, int& pos) { if (vec[pos] == inf || vec.size() == 0) { *T = NULL; return; } else { (*T) = new TreeNode(0); (*T)->val = vec[pos]; Init_TreeNode(&(*T)->left, vec, ++pos); Init_TreeNode(&(*T)->right, vec, ++pos); } } class Solution { public: int res=0; int target; int pathSum(TreeNode* root, int sum) { //基本思想:雙重遞迴,第一重遞迴dfs遍歷root中的每一個節點,第二重遞迴path以該節點為起始點不斷往下求和節點值,如果求和等於target,res+=1 if(root==NULL) return res; target=sum; dfs(root); return res; } void path(TreeNode* root,int sum) { if(root==NULL) return; if(sum+root->val==target) res+=1; path(root->left,sum+root->val); path(root->right,sum+root->val); } void dfs(TreeNode* root) { if(root==NULL) return; path(root,0); dfs(root->left); dfs(root->right); } }; int main() { TreeNode* root = NULL; vector<int> vec = { 1,2,3,4,inf,inf,inf,inf,inf}; int pos = 0; Init_TreeNode(&root, vec, pos); Solution solute; int sum=3; cout<<solute.pathSum(root,sum)<<endl;; return 0; }