LeetCode 257.二叉树的所有路径

embedded/2025/2/5 2:12:27/

题目描述

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

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

示例 1:

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

示例 2:

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

提示:

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

思路

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

递归三部曲:

  1. 确定递归函数的参数和返回值。要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值。
  2. 确定终止条件。本题没有必要遍历到空节点才结束,只需要遍历到叶子结点就可以结束了。当cur不为空,且其左右孩子都为空的时候,就找到叶子节点了。
  3. 确定单层递归的逻辑。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。然后是递归和回溯的过程,递归时需要先判断cur是否为空,如果为空就不进行下一层递归了。递归之后就要回溯,因为path不能一直加入节点,它还要删节点,然后才能加入新的节点。

代码

C++版:

/*** 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:// 递归法// path存放路径,result存放结果集void traversal(TreeNode* n,vector<int>& path,vector<string>& result){// 中path.push_back(n->val);// 终止条件,到达叶子节点if(n->left==NULL && n->right==NULL){string sPath;for (int i = 0; i < path.size() - 1; i++) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return; }// 左if(n->left){traversal(n->left,path,result);path.pop_back(); // 回溯}// 右if(n->right){traversal(n->right,path,result);path.pop_back(); // 回溯}}vector<string> binaryTreePaths(TreeNode* root) {vector<int> path;vector<string> result;if(root==NULL) return result;traversal(root,path,result);return result;}
};

Python版:

python"># Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def traversal(self, cur, path, result):path.append(cur.val)  # 中if not cur.left and not cur.right:  # 到达叶子节点sPath = '->'.join(map(str, path))result.append(sPath)returnif cur.left:  # 左self.traversal(cur.left, path, result)path.pop()  # 回溯if cur.right:  # 右self.traversal(cur.right, path, result)path.pop()  # 回溯def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:result = []path = []if not root:return resultself.traversal(root, path, result)return result

需要注意的地方

1.如果使用迭代法来解决本题,除了模拟递归需要一个栈,同时还需要一个栈来存放对应的遍历路径。


http://www.ppmy.cn/embedded/159624.html

相关文章

MATLAB中的IIR滤波器设计

在数字信号处理中&#xff0c;滤波器是消除噪声、提取特征或调整信号频率的核心工具。其中&#xff0c;无限脉冲响应&#xff08;IIR&#xff09;滤波器因其低阶数实现陡峭滚降的特性&#xff0c;被广泛应用于音频处理、通信系统和生物医学工程等领域。借助MATLAB强大的工具箱&…

【uniapp】uniapp使用java线程池

标题 由于js是性能孱弱的单线程语言&#xff0c;只要在渲染中执行了一些其他操作&#xff0c;会中断渲染&#xff0c;导致页面卡死&#xff0c;卡顿&#xff0c;吐司不消失等问题。在安卓端可以调用java线程池&#xff0c;把耗时操作写入线程池里面&#xff0c;优化性能。 实…

计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Hive:基本查询语法

和oracle一致的部分 和oracle不一样的部分 排序 oracle中,在升序排序中&#xff0c;NULL 值被视为最大的值&#xff1b;在降序排序中&#xff0c;NULL 值被视为最小的值。 在MySQL中&#xff0c;NULL 被视为小于任何非空值。 在Hive中, NULL是最小的; Hive除了可以用order…

前端八股CSS:盒模型、CSS权重、+与~选择器、z-index、水平垂直居中、左侧固定,右侧自适应、三栏均分布局

一、盒模型 题目&#xff1a;简述CSS的盒模型 答&#xff1a;盒模型有两种类型&#xff0c;可以通过box-sizing设置 1.标准盒模型&#xff08;content-box&#xff09;:默认值&#xff0c;宽度和高度只包含内容区域&#xff0c;不包含内边距、边框和外边距。 2.边框盒模型&a…

IM 即时通讯系统-43-简单的仿QQ聊天安卓APP

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

8.原型模式(Prototype)

动机 在软件系统中&#xff0c;经常面临着某些结构复杂的对象的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多&#…

ESP32(Arduino)

本篇内容在熟知51单片机与C语言基础上编写 一&#xff0c;开发板介绍和引脚图 USB接口用于下载程序&#xff0c;电源输入和烧录驱动等等。BOOT启动模式选择&#xff0c;按下为下载模式&#xff0c;放开为运行模式。ESP-32-WROOM-32模组集成了蓝牙&#xff0c;wifi等模块 共48…