题目内容:
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
节点总数 <= 10000
思路:先序遍历+路径追踪
- 先序遍历:按照“根左右”的顺序,遍历树的所有结点。
- 路径记录:在先序遍历中,记录从根结点到当前结点的路径。当路径为根节点到叶节点形成的路径且各节点值的和等于目标值sum时,将此路径加入结果列表。
- 算法流程:
pathsum(root,sum)
函数:- 初始化:结果列表
res
,路径列表temp
- 返回值:返回
res
- 初始化:结果列表
recursion(root,sum
)函数:- 递推参数:当前节点
root
,目标值sum
- 终止条件:若节点
root
为空,则直接返回 - 递推工作:
- 路径更新:将当前节点值
root->val
加入temp
- 目标值更新:
sum=sum-root->val
(即目标值从sum减至0) - 路径记录:当
root
为叶节点且路径和等于目标值,则将此路径temp
加入res
- 先序遍历:递归左/右子节点
- 路径恢复:向上回溯前,需要将当前节点从路径
temp
中删除,即执行temp.pop_back()
- 路径更新:将当前节点值
- 递推参数:当前节点
/**
* 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 {
private:
vector<vector<int> > res;
vector<int> temp;
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
if(!root) return {};
recursion(root, sum);
return res;
}
void recursion(TreeNode *root, int sum)
{
if(!root) return;
temp.push_back(root -> val);
sum -= root -> val;
if(sum == 0 && !root -> left && !root -> right)
res.push_back(temp);
recursion(root -> left, sum); // 左
recursion(root -> right, sum); // 右
temp.pop_back(); // 函数退出之前先弹出当前节点
}
};
参考: