剑指offer刷题笔记
题目描述:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
例子:
(这个例子是在牛客中故意跑错得到的用例)
思路:
- 采取深度优先搜索(前序遍历)来遍历每一条路径
- 两个全局变量,temp放临时路径,result放每条有效的路径
- 每一次遍历,把根节点的数值压入temp中。当走完这条路径,判断是否需要放入result中,然后将temp尾的数据弹出,返回上一层。
- 满足条件的情况:
- 该路径和为目标数据
- 该结点左右结点均为空
源代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root==NULL){
return result;
}
//压入临时路径尾部
temp.push_back(root->val);
//判断是否到路径终点,且该路径的每个数值的和是否为目标值
if( (expectNumber-root->val)==0 && root->left==NULL && root->right==NULL){
result.push_back(temp);
}
//递归先序遍历
//遍历左子树
FindPath(root->left,expectNumber - root->val);
//遍历右子树
FindPath(root->right,expectNumber - root->val);
//临时路径删除最后一个节点,返回上一结点
temp.pop_back();
return result;
}
private:
vector<vector<int>> result;
vector<int> temp;
};