代码随想录_二叉树_leetcode257

文章介绍了如何解决LeetCode上的第257题,即找到给定二叉树所有从根节点到叶子节点的路径。提供了两种方法,一种是递归法,另一种是使用栈进行迭代的深度搜索方法。在递归法中,当遍历到叶子节点时将路径添加到结果中;在迭代法中,使用两个栈分别存储节点和路径,每次处理非叶子节点时将其子节点的值添加到路径中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

 代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <stack>
#include <queue>
#include <string>
using namespace std;

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) {}
};


// leetcode 257 二叉树的所有路径
// 递归法
class Solution {
public:
	void traversal(TreeNode* cur, string path, vector<string>& result)
	{
		path += to_string(cur->val);
		if (cur->left == nullptr && cur->right == nullptr)
		{
			result.push_back(path);
			return;
		}
		if (cur->left != nullptr)
		{
			traversal(cur->left, path + "->", result);  //没有修改path的值
		}
		if (cur->right != nullptr)
		{
			traversal(cur->right, path + "->", result);
		}
	}

	vector<string> binaryTreePaths(TreeNode* root) {
		vector<string> result;
		if (root == nullptr)
		{
			return result;
		}
		string path;
		traversal(root, path, result);
		return result;
	}
};

// 迭代法
// 深度搜索问题
// 使用栈来保存结点  一个栈来保存多条路径 
// 每次弹出结点 如果是叶子结点就保存一条路径
// 如果不是叶子就入栈 然后栈中路径更新
class Solution {
public:
	vector<string> binaryTreePaths(TreeNode* root) {
		vector<string> result;  //最终结果
		stack<TreeNode*> treeSta; //保存结点
		stack<string> pathSta;//保存的路径
		if (root == nullptr)
		{
			return result;
		}
		TreeNode* cur;
		treeSta.push(root);
		string path = to_string(root->val);  // 我们从这里开始就保持先加入值后遍历结点
		pathSta.push(path);
		while (!treeSta.empty())
		{
			cur = treeSta.top();
			treeSta.pop();

			path = pathSta.top();
			pathSta.pop();

			if (cur->left == nullptr && cur->right == nullptr)
			{
				result.push_back(path);
			}
			else
			{
				if (cur->left != nullptr)
				{
					treeSta.push(cur->left);
					pathSta.push(path + "->" + to_string(cur->left->val));
					//先加入值后遍历结点
				}
				if (cur->right != nullptr)
				{
					treeSta.push(cur->right);
					pathSta.push(path + "->" + to_string(cur->right->val));
					//先加入值后遍历结点
				}
			}
		}
		return result;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值