LeetCode144.二叉树的前序遍历

企业IT运维实录:批量部署银河麒麟V10-SP1,Ghost镜像与UKey激活实战 本文详细介绍了企业级银河麒麟V10-SP1操作系统的批量部署全流程,包括标准化镜像制作、自动化封装技术、网络化部署方案及UKey集群激活方案。通过实战案例和技术要点解析,帮助企业IT运维团队大幅提升部署效率,确保系统安全与稳定性。 阅读详情

题目大意:

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

 示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

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

 

详解:

首先分析,无论前序中序肯定都是深度优先,采用栈

  1. 首先new一个列表(存储结果),new一个栈, 定义一个当前待处理的节点(初始值为root节点)
  2. 判断当前节点是否为空,为空退出循环,不为空先将当前节点直接输入到结果,然后执行第3步。(因为是前序遍历,所以当前节点直接输入到结果)
  3. 判断左子节点,不为空,压栈,更新当前节点,执行第2步(因为是前序遍历,所以左右子节点优先左节点。)
  4. 判断右子节点,不为空,压栈,更新当前节点,执行第2步
  5. 这一步分析比较长,写成一段:
  6. 如果执行到了这里这里,说明当前节点的左右子节点都是空的,且当前节点已经输出到结果(第2步输入的),但是还没有压栈(其实已经没有压栈的必要了,因为结果也输出了,又没有子节点)。这个时候就要考虑他的父节点了,父节点在哪呢?栈里!可以看到上面先执行第3步,那么每一个父节点如果他有左节点,那么他的右节点就没有遍历处理(因为随着循环去处理他的左节点了)。所以现在要依次考虑每一个父节点右子节点(此时不需要考虑父节点的左子节点,不理解的自己去面壁思考)

  7. 既然依次考虑,所以需要一个循环,如果当前栈顶节点的右子节点不为空,且右子节点不等于当前节点(这个且非常重要,不然就可能会重复处理右子节点),说明当前右子节点还没有处理,更新当前节点,退出循环,执行第2步。否则直接出栈当前节点,接着判断下一个栈顶,直到栈空了

  8. 至此结束

再详细的思路也不及代码片行,那直接贴代码

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode tmp = root;
        while (tmp != null){
            list.add(tmp.val);
            if(tmp.left != null){
                stack.push(tmp);
                tmp = tmp.left;
                continue;
            }
            if(tmp.right != null){
                stack.push(tmp);
                tmp = tmp.right;
                continue;
            }
            while (true){
                if(stack.isEmpty()){
                    tmp = null;
                    break;
                }
                TreeNode peek = stack.peek();
                if(peek.right != null && peek.right != tmp){
                    tmp = peek.right;
                    break;
                }
                tmp = stack.pop();
            }
        }
        return list;
    }

最后贴一下效率:

144. 二叉树前序遍历 给定一个二叉树返回它的前序遍历示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ... 阅读详情

相关推荐

【简单】力扣算法题解析LeetCode144二叉树前序遍历

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

ylumwd的博客 504

【力扣】给定一个二叉树返回它的前序遍历

给定一个二叉树返回它的前序遍历示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶:递归算法很简单,你可以通过迭代算法完成吗? 分析: 对于这类问题,把它直接看成只有三个节点(根节点,左子树,右子树)的树,不需要展开,直接调用。 先建立两个list里面的类型是Integer包装类型,一...

萌萌咚咚的博客 1952

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 102

Leetcode——144. 二叉树前序遍历

给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路: 用栈(Stack)的思路来处理问题。 前序遍历的顺序为根-左-右,具体算法为: 把根节点push到栈中 循环检测栈是否为空,若不空,则取出栈顶元素,保存其值 看其右子节点是否存在,若存在则push到栈中 看其左子节点...

IT荻的博客 598

LeetCode 144. 二叉树前序遍历

给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? tips : 非递归法,使用栈,先压右子节点,再压左子节点。 class Solution { public: vector<int> preorderTraversal(TreeNode* root) ...

hello_my_coder的博客 255

刻意练习:LeetCode实战 -- 二叉树前序遍历

背景 今天,第二期基础算法Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树遍历方式通常来说有四种:前序遍历、中序遍历、后序遍历以及层次遍历,而LeetCode也有二叉树前序遍历题目,故一起写了。 题目 题号:144 难度:中等 https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 给定...

老马的程序人生 946

leetcode 144. 二叉树前序遍历

-

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

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

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

Yikefore的博客 639

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的博客 172

力扣(LeetCode144. 二叉树前序遍历

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

Pwnpanda的博客 734

LeetCode144题_二叉树前序遍历

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

qq_40263592的博客 1014

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

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

软件科学-郝学胜 613

leetcode144.二叉树前序遍历

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

laplacepoisson的博客 655

leetcode144. 二叉树前序遍历(迭代)

给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * Tree

weixin_44560620的博客 173

LeetCode二叉树前序遍历

题目 给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 &amp;nbsp; &amp;nbsp; \ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; &amp;nbsp; / 3 输出: [1,2,3] 题目地址:https://leetcode-cn.com/problems/binary-tree-preorder-t

hfbin的博客 652

Leetcode 144:二叉树前序遍历(最优雅的解法!!!)

给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 这是一个基础问题 class Solution: def __init__(self): self.ret = [] ...

coordinate的博客 4504

leetcode二叉树前序、中序、后序遍历

给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 要求输出的节点放在一个列表中。所以使用递归算法的话,要先在solution类里添加一个空列表,这样这个列表在整个类中都可以使用。 前序遍历 递归算法: 思路: 如果输入的root为空,就直接返回,如果非空的话,就先将输入节点...

hengaheng的博客 1046

LeetCode题目: 二叉树前序遍历

二叉树前序遍历 给定一个二叉树返回它的 前序 遍历示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<in...

一个不知名码农的专栏 1350

参考资料-薄膜电容DV-DT的测量.zip

参考资料-薄膜电容DV-DT的测量.zip

上一篇: LeetCode102.二叉树的层级遍历
下一篇: LeetCode94.二叉树的中序遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值