题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
关键点:1. 二叉树、递归
2.因为路径是从根节点开始,因此,最先遍历的应该是根节点,所以应该考虑前序遍历
3.如果遍历到叶子节点发现不符条件,此时应该采用回溯,吐出叶子节点。
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int>> ret;
vector<int> temp;
int currentSum = 0;
if(root == NULL)
return ret;
findPath(root, currentSum, ret, expectNumber, temp);
return ret;
}
void findPath(TreeNode* root, int currentSum, vector<vector<int> >&ret, int expectNumber, vector<int>&temp){
currentSum += root -> val;
temp.push_back(root -> val);
bool isLeaf = root -> left == NULL && root -> right == NULL;
if(currentSum == expectNumber && isLeaf){//是叶子节点且路径节点和与给定值相同
ret.push_back(temp);
}
//如果不是叶子节点,则遍历它的子节点
if(root -> left != NULL)
findPath(root -> left, currentSum, ret, expectNumber, temp);
if(root -> right != NULL)
findPath(root -> right, currentSum, ret, expectNumber, temp);
//返回父节点之前,在路径上删除当前节点
temp.pop_back();
}
};