leetcode 257 学习笔记(递归,迭代)

这篇博客介绍了LeetCode 257题的解决方案,重点讨论了如何通过递归和迭代两种方法找到二叉树的所有路径。在递归解法中,详细解释了递归终止条件、单层递归逻辑以及回溯过程。在迭代解法中,使用了前序遍历并借助栈来模拟路径遍历。
摘要由CSDN通过智能技术生成

257. 二叉树的所有路径

问题描述

传送门
在这里插入图片描述

思路:

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

这道题涉及到回溯,因此,我们要把路径记录下来,需要回溯来回退一一个路径在进入另一个路径。

1、递归

① 递归函数函数参数以及返回值

要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值,代码如下:

	void traversal(TreeNode* cur, vector<int>& path, vector<string>& result)  

② 确定递归终止条件

因为本题要找到叶子节点,即cur不为空,其左右孩子都为空的时候,就找到叶子节点。
所以本题的终止条件是:

	if (cur->left == NULL && cur->right == NULL) {
   
	    //接下来,写处理终止的逻辑
	}

这里用vector结构的path来记录路径,所以要把vector结构的path转为string格式,在把这个string 放进 result里。

这里用vector的原因是,在处理单层递归逻辑的时候,要回溯,vector方便回溯。

所以本题的处理终止逻辑是:

	if (cur->left == NULL && cur->right == NULL) {
    // 遇到叶子节点
	    string sPath;
	    for (int i = 0; i < path.size() - 1; i++) {
    // 将path里记录的路径转为string格式
	        sPath += to_string(path[i]);
	        sPath += "->";
	    }
	    sPath += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)
	    result.push_back(sPath); // 收集一个路径
	    return;
	}

③ 确定单层递归逻辑
因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。

	path.push_back(cur->val);

然后是递归和回溯的过程,上面说过没有判断cur是否为空,那么在这里递归的时候,如果为空就不进行下一层递归了。

所以递归前要加上判断语句,下面要递归的节点是否为空,如下

	if (cur->left) {
   
	    traversal(cu
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

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

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

打赏作者

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

抵扣说明:

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

余额充值