Leetcode 144. 二叉树的前序遍历

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

题目

给定一个二叉树,返回它的 前序 遍历。

在这里插入图片描述
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

解法一:递归

递归算法不用多说,很简单。

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preorderTraversal(root, res);
        return res;
    }
    
    public void preorderTraversal(TreeNode node, List<Integer> res) {
        if(node == null) return;
    
        res.add(node.val);
        preorderTraversal(node.left, res);
        preorderTraversal(node.right, res);
    }
}
结果

在这里插入图片描述

解法二:栈 + 非递归

使用栈保存遍历的结点路径。

但要注意一点的就是:先压右节点,再压左节点。(因为栈的反序问题)

这样就能保证会先遍历到结点的左节点了。

代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList<>();
        
        List<Integer> res = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            res.add(node.val);
            
            if(node.right != null) {
                stack.push(node.right);
            }
            
            if(node.left != null) {
                stack.push(node.left);
            }
        }
        
        return res;
    }
}
结果

在这里插入图片描述

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

相关推荐

leetcode 144(二叉树的前序遍历)

水题一道,题目如下 给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 题解 1. 递归 import java.util.ArrayList; /** * Definition for a binary tree ...

ayang818 's blog 317

144. 二叉树的前序遍历

第一次尝试   

波风水门的博客 193

淘特App x-sign参数逆向实战:从抓包到算法定位

本文详细解析了淘特App的x-sign参数逆向过程,从抓包分析到算法定位,涵盖了使用jadx-gui进行静态分析、Frida动态Hook验证以及Native层算法还原等关键技术。文章重点介绍了x-sign参数的生成机制及其在阿里系应用中的安全防护策略,为逆向工程师提供了实用的调试技巧和对抗策略。

5b6n7m8的博客 226

144.二叉树的前序遍历

题目: 知识提要: 前序遍历的规则是 若节点为空,则空操作返回; 否则先访问根节点, 然后前序遍历左子树 再前序遍历右子数 代码一:递归 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val

weixin_40578464的博客 166

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 322

动态对抗Zygisk-IL2CppDumper:Unity游戏安全新策略

本文深入探讨了对抗Zygisk-IL2CppDumper攻击的Unity游戏安全新策略。通过实时内存监控、动态混淆技术和异常行为检测体系,有效防止关键代码被动态提取。文章详细介绍了内存指纹系统、运行时混淆方案和五维特征模型等实用防御手段,帮助开发者提升游戏安全性。

weixin_29325955的博客 305

LeetCode二叉树系列——144.二叉树的前序遍历

关于二叉树的遍历方式,要知道二叉树遍历的基本方式都有哪些。 一些同学用做了很多二叉树的题目了,可能知道前中后序遍历,可能知道层序遍历,但是却没有框架。 我这里把二叉树的几种遍历方式列出来,大家就可以一一串起来了。 二叉树主要有两种遍历方式: 深度优先遍历:先往深走,遇到叶子节点再往回走。 广度优先遍历:一层一层的去遍历。 这两种遍历是图论中最基本的两种遍历方式,后面在介绍图论的时候 还会介绍到。 那么从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式: 深度优先遍历 前序遍历(递归法,迭代.

w20001118的博客 865

利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付

最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本。 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了。 这次要分享的是利用抖音的充值接口,去分析提取出支付链接,分别包含微信原生支付的h5支付链接,和支付宝h5支付链接。 微信h5支付: 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 支付宝h5支付 抖币充值,抖音充值,抖音直播充值官方入口 - 抖音 整个开发流程思路是以下几步: 1.抓包分析抖音的充值的整个流程,提取关键的一些

Android-逆向的博客 6566

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

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

局部变量和全局变量 839

2.13寸电子墨水屏HINK-E0213+esp8266

很久以前买的一块电子墨水屏,运气很好,这个型号HINK-E0213资料很全,而且微雪官网也有相关电路资料等。

梦境虽美,却不长. 3002

PyQt5混搭qfluentwidgets实战:用FramelessWindow快速打造现代化界面

本文详细介绍了如何将PyQt5与qfluentwidgets组件库结合,利用FramelessWindow快速打造现代化无边框界面。通过环境配置、核心特性解析、组件混用技巧及高级样式定制,帮助开发者提升桌面应用的用户体验和美观度,特别适合需要现代UI设计的Python开发者。

sugar的博客 969

leetcode 144. 二叉树的前序遍历

-

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

【Python&RS】哨兵2号(Sentinel2)轨道条带说明+图幅统计(表格+矢量)

今天给大家带来哨兵2号的图幅编号介绍以及全国省、市所需图幅数的统计。网上教程极少,而且结果也不公开。因为每次下载的时候都不知道需要几幅,所以研究后给大家分享一下。

Remote Sensing迷途小书童 1679

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

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

Yikefore的博客 645

用「OpenClaw」打造新媒体运营神器:小红书/公众号全自动选题→创作→排版→发布全流程

对于新媒体运营的从业者来说,AI不是要取代运营人员,而是把他们从繁琐的重复劳动中解放出来,专注于更核心的内容策略、用户运营、品牌建设,这才是AI在传统行业落地的真正价值。这是最终输出可发布内容的核心智能体,我们通过「OpenClaw」的Prompt工程,结合不同平台的排版规范,实现了一键生成符合要求的排版,完全替代人工重复劳动。这套系统的落地,不是技术的炫技,而是真正用AI解决了新媒体运营的核心痛点:用自动化替代重复的人工劳动,用数据决策替代经验主义,用全闭环执行替代纸上谈兵的建议。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 198

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

Pwnpanda的博客 741

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

软件科学-郝学胜 656

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

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

qq_40263592的博客 1036

LeetCode 144. 二叉树的前序遍历

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

m0_64381458的博客 1489

【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

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 243

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
上一篇: Leetcode 129. 求根到叶子节点数字之和
下一篇: Leetcode 145. 二叉树的后序遍历
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值