题目描述:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路:
本题利用先序遍历访问某一节点的值,并且将该节点添加到当前路径序列中,此外累加该节点的值;如果当前节点是叶子节点,则判断当前路径中的值是否等于期望值,如果等於则输出该路径;如果当前节点不是叶子节点,则继续访问该节点的左右子节点;如果在左右子节点中都没有找到满足条件的路径,则返回到当前节点的父节点,注意将当前节点从当前路径序列中去除。
ps:当前路径vector<int>curPath是地址传递,递归过程中共用存储空间,所以需要将当前节点的值从当前路径序列中去除;而curSum是值传递,递归的每一层都保留有对应的当前路径元素和。
通过代码(C++):
/*
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>>result;
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root == nullptr)
return result;
vector<int>curPath;
int curSum = 0;
findPathWithSum(root,expectNumber,curSum,curPath);
return result;
}
void findPathWithSum(TreeNode* curNode,int expectNumber,int curSum,vector<int>curPath)
{
curSum += curNode->val;
curPath.push_back(curNode->val);
bool isLeaf = (curNode->left==nullptr) && (curNode->right==nullptr);
//该curNode节点是叶节点而且路径上的和等于expectNumber,则为想要的输出结果
if(isLeaf && (curSum == expectNumber))
{
result.push_back(curPath);
return;
}
//递归的先序搜索左子树,看是否有合适的值
if(curNode->left != nullptr)
findPathWithSum(curNode->left,expectNumber,curSum,curPath);
if(curNode->right != nullptr)
findPathWithSum(curNode->right,expectNumber,curSum,curPath);
//如果左右子树都没有满足的路径,则回归当父节点
//由于每一层递归调用都有自己的curSum,所以不用对curSum进行操作;
//而curPath是所有递归共享的,所以要将先序遍历加入的当前节点删除。
curPath.pop_back();
return;
}
};