二叉树路径总和

本文介绍了一种解决二叉树问题的方法,通过前序遍历找到从根节点到叶子节点的路径,使其节点值之和等于目标值,并将路径转化为字符串形式。递归过程中,不直接减去count,而是将其传递给子函数,确保路径遍历完整并正确处理边界情况。
摘要由CSDN通过智能技术生成

目录

思路:

转化字符串

递归

整体代码:


 

                        5

                      /    \

                    4       6

                   / \      /   \

                 1  2    9    8

 给定一个目标值,找到一条从根节点到叶子节点的路径,使这个路径的节点总和等于目标值

如给定目标值11

路径即为输出:5->4->2

 与之前的二叉树的所有路径比较相似,这次多了一个数字。

思路:

从根节点出发进行前序遍历,每次遍历完一个节点count就减去该节点的数据,如果发现节点的左右节点都为空(即叶子节点)且count==0;就将收集好的vector<int> path转化为字符串。

转化字符串

这里在所有路径那一样

将录入完成的vector<int>进行遍历,装入一个string里,同时每装一个就在string尾处加上"->"

这一部分的代码如下:

		if (cur->left == NULL && cur->right == NULL && count == 0)
		{
			string str;
			for (int i = 0; i < path.size(); i++)
			{
				str += to_string(path[i]);
				str += "->";
			}
			str.pop_back();
			str.pop_back();
			resultpro.push_back(str);
		}

即终止条件为

if (cur->left == NULL && cur->right == NULL && count == 0)
if (cur->left == NULL && cur->right == NULL && count != 0)
			return;

递归

在递归前,我们已经将NULL的情况处理了,这将不会操作空指针。

if (cur->left)
		{
			path.push_back(cur->left->a);
			traversal(cur->left, count - cur->left->a);
			path.pop_back();
		}
		if (cur->right)
		{
			path.push_back(cur->right->a);
			traversal(cur->right, count - cur->right->a);
			path.pop_back();
		}
		return;

可以发现,在每一层的递归当中,我们没有直接在递归中用count--,而是在调用自己传入参数的时候传入减去下一个节点数据的count。

这样,当这层递归完成后,归的时候count就又会恢复为原count,同时path也进行pop();

整体代码:

class waysumII
{
private:
	vector<int> path;
	string result;
	void traversal(treenode* cur, int count)
	{
		{
			string str;
			for (int i = 0; i < path.size(); i++)
			{
				str += to_string(path[i]);
				str += "->";
			}
			str.pop_back();
			str.pop_back();
			resultpro.push_back(str);
		}
		if (cur->left == NULL && cur->right == NULL && count!= 0)
			return;
		if (cur->left)
		{
			path.push_back(cur->left->a);
			traversal(cur->left, count - cur->left->a);
			path.pop_back();
		}
		if (cur->right)
		{
			path.push_back(cur->right->a);
			traversal(cur->right, count - cur->right->a);
			path.pop_back();
		}
		return;
	}
public:
	vector<string> WaysumII(treenode* root, int sum)
	{
		path.push_back(root->a);
		traversal(root, sum - root->a);
		return result;
	}

};

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值