本文最后更新于:2020年6月29日 晚上

题目描述:

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

实现如下:

//路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
//所以必须是root到叶节点的和
//模拟一个栈,但在线用例要求将路径以vector的形式存储,所以只能使用vetor的push_back和pop模拟
//注意:
//1.父节点将自己的子节点递归调用判断完毕后,此时返回到自己的函数栈帧时。最后需要将自己也pop
//2.叶节点也需要将自己pop
class Solution
{
public:
	vector<int> valueVec;//保存一路径中的元素值
	vector<vector<int> > allPathVec;//保存符合某值的路径
	int currentNumber = 0;//当前累计值
	void Path(TreeNode *root, int expectNumber, int &currentNumber)
	{
		if (root == NULL) return;//防御性动作
		valueVec.push_back(root->val);//将此节点的值存入路径
		currentNumber += root->val;//累计值累加

		if (currentNumber == expectNumber && root->left == NULL && root->right == NULL)//判断当前值和某值是否相等且此节点必须为叶节点
		{
			allPathVec.push_back(valueVec);//将路径存储
			return;//结束本次调用
		}
		else//否则递归调用传入left与right
		{
			Path(root->left, expectNumber, currentNumber);
			Path(root->right, expectNumber, currentNumber);
			currentNumber -= valueVec.back();//此时将本节点pop
			valueVec.pop_back();//减去本节点的值
		}
		if (root->left != NULL || root->right != NULL)//判断这是否为父节点
		{
			//若为父节点,则将本节点从路径中删除且从累计值中减去
			currentNumber -= valueVec.back();
			valueVec.pop_back();
		}
	}
	vector<vector<int> > FindPath(TreeNode* root, int expectNumber) 
	{
		if (root == NULL) return allPathVec;//防御性动作
		Path(root, expectNumber, currentNumber);//递归调用
		return allPathVec;
	}
};