leetcode刷题/二叉树 257. 二叉树的所有路径(DFS)

257. 二叉树的所有路径(DFS)

题意:

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

输入:
   1
 /   \
2     3
 \
  5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
解题思路:

经典的递归问题

确定返回条件这道题需要找的是到叶子节点的路径,所有到叶子节点就需要放回
什么时候到叶子节点?叶子的特点就是无左孩子和右孩子,即root->left == nullptr && root->right == nullptr
递归的过程在每次递归中,需要把节点的值放在一个vector容器,到叶子节点再全部取出.
递归的结果取出vector容器中的值,逐个添加到一个字符串中.然后再添加到结果容器中.
  • 其实这道题就是经典的DFS问题,确认返回条件和该怎么返回,然后只需要套入模板即可.
DFS模板
void dfs(TreeNode*root, vector<int> path)
{
    //空节点直接返回即可
	if (!root) 
		return;  
    
    //逐值添加进容器
	path.push_back(root->val); 
    
    //到了叶子节点,确定返回条件
	if (!root->left && !root->right) 
	{
		'''
		return;
	}
    //递归建立
	dfs(root->left, path,res);  
	dfs(root->right, path,res);
}
本题代码:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
void dfs(TreeNode*root, vector<int> path,vector<string> &res)
{
    //空节点直接返回即可
	if (!root) 
		return;  
    
    //逐值添加进容器
	path.push_back(root->val); 
    
    //到了叶子节点,把容器中的值全部取出来,然后变成字符串添加到结果容器中.
	if (!root->left && !root->right) 
	{
		string re;
		for (int i = 0; i < path.size() - 1; i++)
		{
			re += to_string(path[i]);
			re += "->";
		}
		re += to_string(path[path.size() - 1]);
		res.push_back(re);
		return;
	}
    //递归遍历
	dfs(root->left, path,res);  
	dfs(root->right, path,res);
}
    
    vector<string> binaryTreePaths(TreeNode* root) {
	vector<string> res;
	vector<int>way;
	dfs(root, way, res);
	return res;
    }
};
总结:

用DFS时,需要判断递归返回的条件和返回的结果是什么,而且这道题我用的Path 不是引用的,所有它本身就带有回溯,不需要我们自己来完成.还有该题返回的结果是vector<string>容器,所有我们需要在递归中完成然后返回,即作为引用参数即可.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值