剑指offer:二叉树中和为某一个值的路径

题目描述:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

这种题目我们考虑的就是递归的做法:

首先创建一个二维数组result来保存满足条件路径

创建一个一维数组来保存当前路径

每当一条路径满足要求,就将当前路径存入result数组

递归的终点就是找递归的出口:

0.跟节点为空,不考虑,直接返回。

1.根节点就是我们要找的值而左右子树都为空,result直接存根节点

2.左子树不为空,将左子树作为递归的目标数,期望值减去根节点的值

3.右子树不为空,将右子树作为递归的目标数,期望值减去根节点的值

class Solution {
public:
	vector<vector<int>> result;
	vector<int> cur_path;
public:
	vector<vector<int> > FindPath(TreeNode* root, int expectNumber)
	{
		if (root != nullptr)
		{
			FindOnePath(root, expectNumber);
		}
		return result;
	}


	void FindOnePath(TreeNode* root, int expectNumber)
	{
		//首先将根节点存入当前路径
		cur_path.push_back(root->val);
		if (root->val == expectNumber && root->left == nullptr&&root->right == nullptr)
		{
			result.push_back(cur_path);
		}
		if (root->left != nullptr)
			FindOnePath(root->left, expectNumber - root->val);
		if (root->right != nullptr)
			FindOnePath(root->right, expectNumber - root->val);
		cur_path.pop_back();
	}
};

这里 :在返回值的list中,数组长度大的数组靠前  这个条件我开始并没有注意到,直接提交通过了,因此不能确定是否有隐患,个人觉得对于所有的目标路径最后应该给一个排序函数,得到要求的数组长度大的靠前。

猜你喜欢

转载自blog.csdn.net/Shile975/article/details/88981752
今日推荐