剑指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中,数组长度大的数组靠前  这个条件我开始并没有注意到,直接提交通过了,因此不能确定是否有隐患,个人觉得对于所有的目标路径最后应该给一个排序函数,得到要求的数组长度大的靠前。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值