【LeetCode刷题笔记】144. 二叉树的前序遍历

本文详细解析了二叉树的前序遍历,包括递归实现的官方题解和迭代方法,特别关注了迭代过程中使用Deque与Stack的区别。通过实例代码展示和原理探讨,帮助读者巩固遍历技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的遍历虽然概念简单,但是每次写代码时候都记不清楚,尤其是迭代法,参考了高热度回答的思路,自己做个小整理吧。

递归

给出官方题解的思路,定义一个preorder(root)方法来实现递归。代码如下:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> tree = new ArrayList<Integer>();
        preorder(root,tree);
        return tree;
    }
    public void preorder(TreeNode root, List<Integer> tree) {
        if (root == null) {
            return;
        }
        tree.add(root.val);
        preorder(root.left, tree);
        preorder(root.right, tree);
    }
}

迭代

官方题解的图片演示其实很清晰,但是前序遍历这里迭代的代码写的有点绕,借鉴了中序遍历的迭代代码,整合的很清晰~
利用了Deque双端队列这个数据结构,我一直理解的Deque是先进先出,stack是先进后出。但是验证改成stack后没有报错,给我的三观产生了巨大冲击,下篇博客,我将好好梳理下中间的原理到底是什么。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        Deque<TreeNode> que = new LinkedList<TreeNode>();
        //这里的deque和stack实现的pop方式最后是否相同
        // Deque<TreeNode> que = new LinkedList<TreeNode>();
        // Deque和Stack之间的pop实现的形式?
        Stack<TreeNode> que = new Stack<>();
        while (root != null || !que.isEmpty()) {
        	//节点不为空一直压栈
            while (root != null) {
                res.add(root.val);
                que.push(root);
                root = root.left;
            }
            //节点为空,就出栈
            root = que.pop();
            root = root.right;
        }
        return res;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值