剑指offer——33. 二叉搜索树的后序遍历序列

34. 二叉树中和为某一值的路径

NowCoder

题目描述

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12


解题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
深度优先遍历:推演过程: 前序遍历 根 左 右边
num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1
首先:
1、第一个dfs(root->left, sum, vRes,vPatn);
:先遍历左分支 5,4,12,9 root->12 sum余下 22-(5+4+12+9) = -8 return
**/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> findPath(TreeNode* root, int sum) {
vector<vector<int>> vRes;
vector<int> vPatn;
dfs(root, sum, vRes,vPatn);
return vRes;
}

void dfs(TreeNode* root, int sum, vector<vector<int>> &vRes,vector<int>& vPatn)
{
//结束条件 当前分支为空 并且sum的值已经不足 没必要继续向下分支继续
if(!root || sum <= 0 ) return;
//加入数据
vPatn.emplace_back(root->val);
sum -= root->val; //sum的每一个值都有记录
//恰好匹配 当前为叶子节点并且sum=0
if(!root->left && !root->right && sum == 0)
{
vRes.emplace_back(vPatn);
}
dfs(root->left, sum, vRes,vPatn);
dfs(root->right, sum, vRes,vPatn);
vPatn.pop_back(); //删掉最后一个元数 回到前序遍历的上一个节点
}
};
创作不易,欢迎打赏!
-------------本文结束感谢您的阅读-------------