1. 程式人生 > 其它 >437路徑總和 III(雙重遞迴)

437路徑總和 III(雙重遞迴)

技術標籤:LeetCode演算法leetcode

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. -3 -> 11

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;
}