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

news/2024/12/2 15:05:50/

1.问题

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

示例 1:
在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

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

示例 3:

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

示例 4:
在这里插入图片描述

输入:root = [1,2]
输出:[1,2]

示例 5:
在这里插入图片描述

输入:root = [1,null,2]
输出:[1,2]

提示

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

2.解题思路

2.1 递归

中序遍历的规则是 根-左-右,然后访问左子树、右子树时同样按照此规则遍历,非常容易通过递归实现,按照规则,代码非常容易写出来。定义 preorderTraversal(root) 为递归遍历函数方法,root 为根节点。伪代码:

root.val;
preorderTraversal(root.left);
preorderTraversal(root.right);

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

2.2 迭代

显示利用栈结构,遍历二叉树。
引用LeetCode动态图解迭代过程:
1)访问根节点
在这里插入图片描述
2)根节点入栈
在这里插入图片描述
3)左子树根节点遍历、入栈
在这里插入图片描述
4)左子树根节点出栈,遍历其左右子节点
在这里插入图片描述
5)左根节点左子树不存在,遍历其右子树4
在这里插入图片描述
6)左子树遍历完毕,遍历根节点右子树
在这里插入图片描述
7)遍历右子树根节点,根节点出栈
在这里插入图片描述
8)右子树根节点入栈
在这里插入图片描述

9)右子树左节点遍历,入栈
在这里插入图片描述

10)右子树左节点遍历完毕,该节点出栈
在这里插入图片描述
11)遍历右子树右节点,右子树根节点出栈
在这里插入图片描述
12)右子树右节点遍历,入栈
在这里插入图片描述
13)右子树遍历完毕,出栈
在这里插入图片描述
14)遍历完毕
在这里插入图片描述
复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

  • 空间复杂度:O(n),为迭代过程中显式栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

3.代码

public class Solution {/*** 递归*** @param root TreeNode类* @return int整型一维数组*/public int[] preorderTraversal (TreeNode root) {// write code hereif (null == root) {return new int[0];}List<Integer> list = new ArrayList();preorderTraversal2(list, root);return list.stream().mapToInt(Integer::valueOf).toArray();}//递归方法public void preorderTraversal2 (List<Integer> list, TreeNode root) {if (null == root) {return;}list.add(root.val);preorderTraversal2(list, root.left);preorderTraversal2(list, root.right);}//迭代,栈思想public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (null == root) {return res;}Stack<TreeNode> stack = new Stack<>();stack.add(root);TreeNode p;while (!stack.isEmpty()) {p = stack.pop();res.add(p.val);//先把右节点入栈if (null != p.right) {stack.add(p.right);}if (null != p.left) {stack.add(p.left);}}return res;}
}

http://www.ppmy.cn/news/49474.html

相关文章

如何智能改写文案内容-如何用ai改字

伪原创在线文章生成器 在当今数字时代&#xff0c;营销推广已成为各行各业的必备工具&#xff0c;其中之一便是内容营销。作为内容营销的一部分&#xff0c;文章撰写是非常关键的环节。为了满足市场需求&#xff0c;越来越多的在线文章生成器涌现出来&#xff0c;其中最受欢迎…

【C++】二叉搜索树(概念、实现、应用以及OJ题详解)

前言&#xff1a; 此前我们在C语言实现数据结构的时候学习过二叉树&#xff0c;但是那个时候我们没有深入学习二叉搜索树。本章重提二叉树并详解二叉搜索树有下面两个原因&#xff1a; 1、为我们下一章学习set和map做准备&#xff1b;2、详解我们进阶一点的二叉树的面试OJ题&a…

高新技术企业申报有哪些常见问题

高新技术企业 高新技术企业是指在中国&#xff08;不包括香港、澳门、台湾&#xff09;注册一年以上的居民企业&#xff0c;在国家重点支持的高新技术领域不断开展研发和技术成果转化&#xff0c;形成企业核心自主知识产权&#xff0c;并在此基础上开展经营活动。 高新技术企…

实测有效!手把手带你将 Docker Image 体积减少 90%

Docker Image 体积越大,那部署要花的时间就越长;假如每个版本都有好几 GB,那并不是一个理想的状态;因此笔者开始动手实作,想看看到底能将 Docker Image 的体积缩小多少! 大纲 ㄧ、先初始化一个简易的 Node.js 专案 二、撰写 Dockefile,了解优化前体积有多大 三、使用 No…

反垃圾邮件产品测试评价方法示意图

声明 本文是学习信息安全技术 反垃圾邮件产品技术要求和测试评价方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 反垃圾邮件产品测试评价方法 测试环境 反垃圾邮件产品的典型测试环境如图1所示。 图1 反垃圾邮件产品典型测试环境示意图 测试设…

微搭低代码实现投票功能

经常有一类需求&#xff0c;就是投票的功能&#xff0c;需要限制每一个选项每个人只可以投一票&#xff0c;投完之后需要统计票数。本篇教程我们讲解一下如何利用微搭低代码工具来实现投票功能。 1 设计数据源 我们需要设计一个数据源来记录用户的投票&#xff0c;如何限制用…

[5 种有效方法] 适用于 Android 的通用解锁图案/密码

在当今世界&#xff0c;保护您的密码对于您的文件和数据的安全至关重要&#xff0c;尤其是在第三方应用程序盛行的情况下。为这些应用程序注册帐户不是问题&#xff0c;就像记住它们一样。但是&#xff0c;如果您不知何故忘记了手机密码&#xff0c;您仍然可以在不丢失宝贵数据…

vsdcode更新includepath

vsdcode更新includepath $:gcc -v : g c c 8.3.0......... C O L L E C T L T O W R A P P E R / u s r / l i b / g c c / x 8 6 6 4 − l i n u x − g n u / 8 / l t o − w r a p p e r c d / u s r / l i b / g c c / x 8 6 6 4 − l i n u x − g n u / 8 , f i n d c…