LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径

1、题目

题目链接:257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。

示例 1:
image.png

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

示例 2:

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

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

2、深度优先搜索(递归实现)

思路

这道题目要求返回从二叉树的根节点到所有叶子节点的路径。一种直观的解法是使用深度优先搜索(DFS)。
在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

  • 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
  • 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。

如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。

代码

#include <iostream>
#include <vector>
#include <string>using namespace std;//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 traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {// 将当前节点的值添加到path中path.push_back(cur->val);// 判断当前节点是否是叶子节点(即没有左右子节点)if (cur->left == nullptr && cur->right == nullptr) {// 用于存储从根节点到当前叶子节点的路径。string sPath;// 将path里记录的路径转为string格式for (int i = 0; i < path.size() - 1; i++) {// 将path中的元素转换为字符串并添加到sPath中sPath += to_string(path[i]);// 添加箭头符号表示路径关系sPath += "->";}// 将path中的最后一个元素(即当前叶子节点的值)转换为字符串,并添加到sPath中sPath += to_string(path[path.size() - 1]);// 将sPath添加到result中result.push_back(sPath);return;}// 如果当前节点有左子节点if (cur->left) {// 递归遍历左子树traversal(cur->left, path, result);// 回溯,将左子节点从path中移除path.pop_back();}// 如果当前节点有右子节点if (cur->right) {// 递归遍历右子树traversal(cur->right, path, result);// 回溯,将右子节点从path中移除path.pop_back();}}vector<string> binaryTreePaths(TreeNode* root) {// 用于存储所有从根节点到叶子节点的路径vector<string> result;// 用于存储从根节点到当前节点的路径vector<int> path;if (root == nullptr) {return result;}traversal(root, path, result);return result;}
};int main() {Solution s;TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);vector<string> result = s.binaryTreePaths(root);for (string path : result) {cout << path << endl;}return 0;
}

复杂度分析

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2)

3、深度优先搜索(递归实现精简版)

思路

这里需要注意在函数定义的时候 void traversal(TreeNode* cur, string path, vector<string>& result) ,定义的是string path,每次都是复制赋值,不用使用引用,否则就无法做到回溯的效果。
在** **traversal(cur->left, path + "->", result); 中的 path + "->"隐藏了回溯操作。 每次函数调用完,path 依然是没有加上 "->" 的,这就是回溯了。

代码

class Solution {
private:void traversal(TreeNode* cur, string path, vector<string>& result) {// 将当前节点的值添加到path中path += to_string(cur->val);// 判断当前节点是否是叶子节点(即没有左右子节点)if (cur->left == nullptr && cur->right == nullptr) {// 将path添加到result中result.push_back(path);return;}// 如果当前节点有左子节点if (cur->left) {// 递归遍历左子树,路径加上 "->"// 注意:这里的path加上 "->" 并不是在原path的基础上添加,而是直接在path末尾添加 "->"// 这样每次函数调用完,path依然是没有加上"->" 的,这里隐藏的是回溯的操作traversal(cur->left, path + "->", result);}// 如果当前节点有右子节点if (cur->right) {// 递归遍历右子树,路径加上 "->"traversal(cur->right, path + "->", result);}}public:vector<string> binaryTreePaths(TreeNode* root) {// 用于存储所有从根节点到叶子节点的路径vector<string> result;if (root == nullptr) {return result;}// 用于存储从根节点到当前节点的路径string path;traversal(root, path, result);return result;}
};

复杂度分析

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2)

4、广度优先搜索(迭代法)

思路

我们也可以用广度优先搜索来实现。我们维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时,广度优先搜索结束,我们即能得到答案。

代码

class Solution {
public:vector<string> binaryTreePaths(TreeNode* root) {// 用于存储所有从根节点到叶子节点的路径vector<string> paths;if (root == nullptr) {return paths;}// 使用队列存储树的遍历节点和对应的路径queue<TreeNode*> queTree;queue<string> quePath;// 初始时将根节点和根节点的值加入队列queTree.push(root);quePath.push(to_string(root->val));while (!queTree.empty()) {// 取出队首节点和对应的路径TreeNode* node = queTree.front();queTree.pop();string path = quePath.front();quePath.pop();// 如果当前节点是叶子节点,则将当前路径添加到paths中if (node->left == nullptr && node->right == nullptr) {paths.push_back(path);}// 如果当前节点有左子节点,则将左子节点和更新后的路径加入队列if (node->left) {queTree.push(node->left);quePath.push(path + "->" + to_string(node->left->val));}// 如果当前节点有右子节点,则将右子节点和更新后的路径加入队列if (node->right) {queTree.push(node->right);quePath.push(path + "->" + to_string(node->right->val));}}return paths;}
};

复杂度分析

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(n^2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块&#xff0c;类似前几…

【数据结构-二叉搜索树的增删查改】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

vue2人力资源项目2登录接口、跳转主页

用户名和密码 解决跨域问题 1.在vue.config.js里配置 proxy: {// 如果请求地址里有api&#xff0c;就转成这个地址/api: {target: https://heimahr.itheima.net/}}// before: require(./mock/mock-server.js)}, axios封装 utils/request.js import axios from axios// creat…

Linux-信号执行

1. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…

户口本翻译件怎么处理?

户口本是中国公民的重要证件&#xff0c;由中华人民共和国公安部精心制作&#xff0c;不仅是国内身份的凭证&#xff0c;更是走向世界的一张关键名片。对于想出国留学 、追求移民生活或是追寻异国风情的旅行者来说&#xff0c;户口本翻译件都是不可或缺的一部分。那么&#xf…

Duplicate entry ‘asdfg‘ for key ‘clazz.name‘

Mybatis:java.sql.SQLIntegrityConstraintViolationException:Duplicate entry ‘asdfg’ for key ‘clazz.name’ 违反了数据库的唯一约束条件&#xff0c;即插入数据的时候具有唯一约束&#xff08;被unique修饰&#xff09;的列值重复了 在修改的过程中发生错误&#xff0c;…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文&#xff1a;Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought&#xff08;CoT&#xff09; prompting 的方法通过结合 few-show prompt 的思路&#xff0c;让 LLM 能够挑战更具…

蓝桥青少一月 STEMA-Python 测评第一题

第一题&#xff08;难度系数 2&#xff0c;18 个计分点&#xff09; (注.input()输入函数的括号中不允许添加任何信息) 编程实现&#xff1a; 给定一个正整数 N&#xff0c;输出 N 除以 3 的商。 输入描述&#xff1a;输入一个正整数 N 输出描述&#xff1a;输出 N 除以 3 的商…

2024年抖音小店最新起店玩法,比你报的上万课程都有用!

大家好&#xff0c;我是电商糖果 刚开店的朋友&#xff0c;一定会遇到出单难&#xff0c;店铺没有流量的问题。 自己在网上找一堆教程&#xff0c;或者花高价去报课程。 有的朋友比较幸运&#xff0c;遇到了好的领路人&#xff0c;但是大部分朋友还是没有那么幸运的。 糖果…

API低代码平台介绍2-最基本的数据查询功能

最基本的数据查询功能 本篇文章我们将介绍如何使用ADI平台定义一个基本的数据查询接口。由于是介绍平台具体功能的第一篇文章&#xff0c;里面会涉及比较多的概念介绍&#xff0c;了解了这些概念有助于您阅读后续的文章。 ADI平台的首页面如下&#xff1a; 1.菜单介绍 1.1 O…

【协同过滤】ItemCF协同过滤方法简介

一、ItemCF协同过滤方法 ItemCF 是基于物品相似度进⾏推荐的协同过滤算法。 通过计算共现矩阵中物品列向量的相似度得到物品之间的相似矩阵&#xff0c; 再找到⽤户的历史正反馈物品的相似物品进⾏进⼀步排序和推荐&#xff0c;Item CF的具体步骤如下&#xff1a; 构建共现矩…

测试项目实战——安享理财1(测试用例)

说明&#xff1a; 1.访问地址&#xff1a; 本项目实战使用的是传智播客的安享理财项目&#xff08;找了半天这个项目能免费用且能够满足测试实战需求&#xff09; 前台&#xff1a;http://121.43.169.97:8081/ 后台&#xff1a;http://121.43.169.97:8082/ &#xff08;点赞收藏…

Python turtle绘制图形详解

Python 的 Turtle 模块是一个简单而直观的绘图工具&#xff0c;可以帮助初学者理解基本的图形绘制概念。 1.导入 Turtle 模块&#xff1a; import turtle 2.创建 Turtle 对象&#xff1a; t turtle.Turtle() 3.绘制图形&#xff1a; 4.移动Turtle对象&#xff1a;t.forward(di…

点击短信链接唤起Android App实战

一.概述 在很多业务场景中,需要点击短信链接跳转到App的指定页面。在Android系统中,想要实现这个功能,可以通过DeepLink或AppLink实现。二.方案 2.1 DeepLink 2.1.1 方案效果 DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式,不受系统版本限制。当用户…

腾讯云优惠券领取指导及优惠券使用指南详解

在当今云计算市场&#xff0c;腾讯云以其出色的性能和服务质量受到了广大用户的青睐。为了回馈用户&#xff0c;腾讯云经常推出各种优惠活动&#xff0c;其中就包括优惠券的发放。那么&#xff0c;如何领取腾讯云优惠券&#xff0c;并正确地使用它们呢&#xff1f;本文将为您详…

虚拟机镜像文件qcow2格式转vmdk

一、在esxi上虚拟机导出qcow2镜像文件 1、卸载数据盘、网卡 2、登录虚拟机所在物理服务器&#xff0c;查找系统盘名为vm-101-disk-0的文件位置 find / -name "vm-101-disk-0"使用命令导出qcow2镜像&#xff08;进度条走完就完成了&#xff09;&#xff1a; qemu…

JAVA----Thread(2

Thread 提供的属性和方法 目录 Thread 提供的属性和方法一.构造方法1.Thread() :2.Thread(Runnable target) :3.Thread(String name) :main 线程 4.Thread(Runnable target, String name) : 二.属性1.ID (getId)2.名称(getName)3.状态(getState)4.优先级 (getPriority)5.是否后…