Leetcode144 二叉树的前序遍历

【简单】力扣算法题解析LeetCode144:二叉树的前序遍历 本文介绍了一种优化的迭代方法来实现二叉树的前序遍历。通过使用栈来模拟递归过程,优先访问根节点后深入左子树,并延迟处理右子树以减少栈深度。代码采用Java实现,选择ArrayList存储结果和ArrayDeque作为栈,确保高效执行。关键优化包括避免存储空节点和仅在必要时缓存右子树。该方法在时间和空间复杂度上均表现优异,适合处理大规模树结构。 阅读详情

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

知识点:二叉树递归

递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。

而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

思路:

什么是二叉树的前序遍历?简单来说就是“根左右”,展开来说就是对于一颗二叉树优先访问其根节点,然后访问它的左子树,等左子树全部访问完了再访问其右子树,而对于子树也按照之前的访问方式,直到到达叶子节点。

从上述前序遍历的解释中我们不难发现,它存在递归的子问题:每次访问一个节点之后,它的左子树是一个要前序遍历的子问题,它的右子树同样是一个要前序遍历的子问题。那我们可以用递归处理:

  • 终止条件: 当子问题到达叶子节点后,后一个不管左右都是空,因此遇到空节点就返回。
  • 返回值: 每次处理完子问题后,就是将子问题访问过的元素返回,依次存入了数组中。
  • 本级任务: 每个子问题优先访问这棵子树的根节点,然后递归进入左子树和右子树。

代码如下:

public List<Integer> preorderTraversal(TreeNode root){
    List<Integer> res = new ArrayList<>();
    if(root == null)
        return res;
    preorder(res,root);
    return res;

}
public void preorder(List<Integer> list,TreeNode root) {
    if(root == null)
        return;
    list.add(root.val);
    preorder(list, root.left);
    preorder(list, root.right);

}

法二:

迭代法+栈

  • step 1:优先判断树是否为空,空树不遍历。
  • step 2:准备辅助栈,首先记录根节点。
  • step 3:每次从栈中弹出一个元素,进行访问,然后验证该节点的左右子节点是否存在,存的话的加入栈中,优先加入右节点。
public List<Integer> preorderTraversal(TreeNode root) {

     List<Integer> list = new ArrayList<>();
        Stack<TreeNode> s = new Stack<>();
        if(root == null)
            return list;
        s.push(root);
        while(!s.isEmpty()){
            TreeNode cur = s.pop();
            list.add(cur.val);
            if(cur.right != null)
                s.push(cur.right);
            if(cur.left != null)
                s.push(cur.left);
        }
    return list;
}

Leetcode——144,二叉树前序遍历 /** * \* Created: liuhuichao * \* Date: 2019/8/21 * \* Time: 27:39 PM * \* Description: 二叉树的前序遍历 : 前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树 * \ * 给定一个二叉树,返回它的 前序 遍历。 * <p> *  示例: * &l... 阅读详情

相关推荐

BUSCO评估基因组的完整性

因为数据库收集的时候找的就是在不同的物种间都是单拷贝的基因,所以说在评估的物种里面应该也是单拷贝的状态才对。基因组层面评估:先去基因组上预测这些基因,再去做评估,如果说给他是一个注释好的基因集,这个时候提供的是一个蛋白集合,它就直接是去进行同源搜索,再去评估,看BUSCO数据库里面的这些单拷贝基因有或者无;首先,tblastn也是同源搜索,同源搜索之后,去对转录本进行读码框预测,预测完的结果还是去进行hmmsearch的搜索(hmmsearch是做蛋白质结构域搜索的),最终拿到BUSCO评估结果。

qq_64400864的博客 2959

算法与数据结构学习(34)-树结构(二叉树的前中后序查找)

二叉树-查找指定节点 要求 1.请编写前序查找,中序查找和后序查找的方法。 2.并分别使用三种查找方式,查找 heroNO = 5 的节点 3.并分析各种查找方式,分别比较了多少次 使用前序、中序、后序方式来查询指定的结点 前序查找思路: 1.先判断当前结点的no是否等于要查找的 2.如果是相等,就直接返回当前结点 3.如果不相等,则判断当前结点的左节点是否为空,如果不为空,则递归前序查找 4.如...

九岁ya的博客 225

电磁场数值分析作业(西电)共5次【2021】

文章目录作业1作业2作业3作业4作业5 作业1 一个二维正方形(边长a=10mm)的静电场区域,电位边界条件如图所示(单位:V),求区域内的电位分布。要求用超松弛迭代法求解差分方程组进行计算。 clc clear close all hx=11; hy=11; v1=zeros(hy,hx); v1(hy,:)=ones(1,hx)*100; v1(1,:)=ones(1,hx)*50; for i=1:hy v1(i,1)=0; v1(i,hx)=100; end w=2/(1+

薛定谔的壳的博客 5071

关于二叉查找树中的某个节点的前趋和后继的算法(Python实现)

废话不多说,代码如下:# -*- coding:utf-8 -*- def Tree_Predecessor(x): '''给定一个二叉查找树的节点z,要求找出在中序遍历下它的前趋''' if left[x] != None: return Tree_Maximum(left[x]) y = p[x] while y != None and x ==

bojdoog的博客 1141

麒麟V10系统下微信PC版安装全攻略:从源配置到一键安装(附常见问题解决)

本文详细介绍了在麒麟V10系统下安装和优化微信PC版的完整流程,包括系统环境准备、软件源配置、多途径安装方案以及性能优化技巧。特别针对国产操作系统用户,提供了从基础安装到高级配置的一站式解决方案,并附有常见问题排查方法,帮助用户快速实现微信PC版的高效运行。

weixin_30500105的博客 712

别再调PID了!用MATLAB/Simulink给四旋翼无人机搭个ADRC控制器(附完整仿真模型)

本文详细介绍了在MATLAB/Simulink环境中为四旋翼无人机搭建ADRC控制器的完整流程,包括核心原理、Simulink建模、参数调试技巧及与PID控制的性能对比。ADRC通过扩张状态观测器(ESO)有效提升无人机在复杂扰动下的控制性能,特别适合四旋翼无人机这类强耦合系统。文章还提供了完整的仿真模型和工程实践问题解决方案。

weixin_26808439的博客 381

【LeetCode】-- 144. 二叉树的前序遍历

给你二叉树的根节点root,返回它节点值的前序遍历。

局部变量和全局变量 839

【YOLOv12[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

静谧、淡雅 893

Leetcode 144 二叉树的前序遍历

二叉树的前序遍历

weixin_44852067的博客 488

从零开始做对容量规划:一文讲透 SAP Greenfield sizing 与 Quick Sizer 落地方法

摘要 SAP项目早期硬件规划面临业务细节缺失的挑战,Greenfield sizing方法通过Quick Sizer工具将业务需求转化为硬件资源需求。该方法聚焦主要负载驱动因素而非精确预测,采用标准化问卷形式输入并发用户数、业务处理量等参数,输出内存、CPU等资源需求。关键步骤包括选择正确的Quick Sizer版本、创建sizing项目、参考SAP基准测试和认证目录校准结果,最终将需求交由硬件厂商落地。该方法特别适用于缺乏历史数据的新系统部署,帮助在不确定性中建立可控的容量规划模型,避免资源浪费或性能不足

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 211

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1004

144. 二叉树的前序遍历

第一次尝试   

波风水门的博客 193

MIC:最大信息系数

目录 1. 概念 1.1 MIC 1.2 互信息 2.MIC的优点 3. 算法原理 3.1 MIC公式原理 3.2MIC计算步骤 (1)计算最大互信息值 (2)对最大的互信息值进行归一化 (3)选择不同尺度下互信息的最大值作为MIC值 4. 代码实现 6. 其他方法 1. 概念 1.1 MIC MIC,即(Maximal Information...

满腹的小不甘 5万+

leetcode 144. 二叉树的前序遍历

-

夜空像是一片紫水潭,星星是些不动的大亮点,夜风是些浅蓝色的流线,云端传来喧嚣的声音。 1294

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

二叉树OJ题:LeetCode--144.二叉树的前序遍历

LeetCode--144.二叉树的前序遍历:使用C语言递归实现的详细解题思路(分步骤详细介绍),你也快来试试吧!

Yikefore的博客 645

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Leetcode 144. 二叉树的前序遍历 C++

Leetcode 144. 二叉树的前序遍历 题目 给定一个二叉树,返回它的 前序 遍历。 测试样例 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 题解 递归实现,详细过程见代码 代码 vector<int> ans; void search(TreeNode* root){ if(root == NULL) return; ans.push_back(root->

weixin_43750513的博客 178

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

力扣(LeetCode)144. 二叉树的前序遍历

思路: 整体和94题类似,借助栈进行操作。 前序遍历:根左右 具体操作: (假设初始根结点不为空,申请栈空间,这里用Stack数组代替,下标top初始为-1) 先把根结点放入Stack中,这样top!=-1,就可以进行while循环了 ①在第一遍while循环中,先把栈中的元素(根节点)取出来记为p,并打印(或保存),然后判断其右孩子结点是否存在,存在则放入Stack中,随后再检测其左孩子结点是...

Pwnpanda的博客 741

LeetCode第144题_二叉树的前序遍历

给你二叉树的根节点root,返回它节点值的。

qq_40263592的博客 1035

力扣 144:二叉树前序遍历的优雅实现

本文以力扣144题为例,详细讲解了二叉树前序遍历的递归实现方法。前序遍历遵循"根→左→右"的顺序,通过递归可以优雅实现:先处理当前根节点,再递归处理左右子树。文章强调递归设计的三个关键步骤:明确函数意义、设置边界条件、编写递归逻辑,并提供了C++代码示例。同时指出递归思维的核心是信任函数功能,不必纠结调用细节。该方法可以迁移到N叉树等更复杂的树形结构遍历中,是算法学习的重要基础。

软件科学-郝学胜 654

【leetcode】144.二叉树的前序遍历

【leetcode】144.二叉树的前序遍历题目思路代码 题目 leetcode原题链接 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root = [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 思路 递归 递归函数参数:当前节点node,用于存放结果的数组ans 确定递归返回条件:当前节点为空,直接return 单层递归逻辑:前序遍历是’根

laplacepoisson的博客 660

LeetCode 144. 二叉树的前序遍历

组队打卡,更多解法等你一起来参与哦!

m0_64381458的博客 1489

144. 二叉树的前序遍历 LeetCode 力扣

给定一颗二叉树,返回他的前序遍历 解决思路: 遇到二叉树问题,如果深度不深,则可以直接用二叉树的递归遍历。 如果深度预计很深的话,可以用非递归遍历 public List<Integer> preorderTraversal(TreeNode root) { if (root == null) { return Collections.emptyList(); } List<Integer> re.

ZhaoXia_hit的博客 202

LeetCode 144二叉树的前序遍历

LeetCode 144二叉树的前序遍历 题目简述:给定一个二叉树,返回它的 前序 遍历。 输入:[1,null,2,3] 输出:[1,2,3] 思路:递归 class Solution { public: vector<int> res; void dfs(TreeNode *root) { if(!root) return; res.push_back(root->val); dfs(root->l

XBlog 242

leetcode 144 二叉树的前序遍历,非递归,C语言实现

测评 题目 leetcode 144 代码 int* preorderTraversal(struct TreeNode* root, int* returnSize){ *returnSize = 0; if (root == NULL) return 0; #define MAX 1000000 int *arr = (int *)malloc(sizeof...

qq_42007287的博客 232

Leetcode144. 二叉树的前序遍历

Leetcode144. 二叉树的前序遍历 递归: class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); if (root == null) { return result; } // 借助栈完成二叉树的

Loser_you的博客 175
上一篇: Leetcoe103. 二叉树的锯齿形层序遍历
下一篇: Leetcode94 二叉树的中序遍历
魑魅魍魉114
博客等级 码龄10年 165粉丝 240原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值