一、题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路:
- 由于路径是从根节点出发到叶子节点结束,因此可考虑常见的二叉树的遍历方式中符合的前序遍历方式,即先遍历根节点,再遍历左子节点,再遍历右子节点;
- 路径的可考虑采用对应节点上的元素值来表示。
- 从根节点往下,当访问到某一节点时,则将该节点的值加到路径上,并累加该节点的值。
- 当搜索完毕(到叶子节点)回到上一层二叉树时,则需要在路径上删除当前节点,并删除当前节点的值。
二、实现代码
/*有问题,待修改**/
/*
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) {
//用vector存储路径中的节点的值,表示路径
std::vector<vector<int> > path;
std::vector<int> s_path;
if(root == NULL)
return path ;
int currentSum = 0;
FindSumPath(root, path,s_path, currentSum,expectNumber);
return path;
}
vector<vector<int> > FindSumPath(TreeNode* root,std::vector<vector<int> > s_path, std::vector<int> path,int currentSum,int expectNumber){
currentSum = currentSum + root->val;
s_path.push_back(root->val);
//如果找到的是叶子节点,并且路径上所有节点的值等于输入的期望整数
//则打印出这条路径上所有元素的值
bool isLeaf = root->left==NULL && root->right == NULL;
if(currentSum==expectNumber && isLeaf){
cout << "A path found:" ;
path.push_back(s_path);
}
//如果不是叶节点,则遍历它的子节点
if(root->left != NULL)
FindSumPath(root->left,path,s_path,currentSum, expectNumber);
if(root->right != NULL)
FindSumPath(root->left,path,s_path,currentSum, expectNumber);
//返回上一层节点之前,删除路径上的当前节点
s_path.pop_back();
return path;
}
};