当前位置: 首页 > news >正文

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

目录

题目描述:

解法一:递归法

解法二:迭代法

解法三:Morris 遍历


二叉树的前序遍历

题目描述:

给你二叉树的根节点 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

解法一:递归法

    List<Integer> res = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root == null){return res;}res.add(root.val);preorderTraversal(root.left);preorderTraversal(root.right);return res;}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 nn 是二叉树的节点数。每一个节点恰好被遍历一次。
  • 空间复杂度:O(n)O(n),为递归过程中栈的开销,平均情况下为 O(\log n)O(logn),最坏情况下树呈现链状,为 O(n)O(n)。

解法二:迭代法

    public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null){return res;}Deque<TreeNode> stack = new ArrayDeque<>();stack.push(root);while(!stack.isEmpty()){TreeNode temp = stack.pop();res.add(temp.val);if(temp.right != null){stack.push(temp.right);}if(temp.left != null){stack.push(temp.left);}}return res;}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 nn 是二叉树的节点数。每一个节点恰好被遍历一次。
  • 空间复杂度:O(n)O(n),为迭代过程中显式栈的开销,平均情况下为 O(\log n)O(logn),最坏情况下树呈现链状,为 O(n)O(n)。

解法三:Morris 遍历

    public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if (root == null) {return res;}TreeNode p1 = root, p2 = null;while (p1 != null) {p2 = p1.left;if (p2 != null) {while (p2.right != null && p2.right != p1) {p2 = p2.right;}if (p2.right == null) {res.add(p1.val);p2.right = p1;p1 = p1.left;continue;} else {p2.right = null;}} else {res.add(p1.val);}p1 = p1.right;}return res;}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 nn 是二叉树的节点数。没有左子树的节点只被访问一次,有左子树的节点被访问两次。
  • 空间复杂度:O(1)O(1)。只操作已经存在的指针(树的空闲指针),因此只需要常数的额外空间。

http://www.lryc.cn/news/45754.html

相关文章:

  • 【数据库管理】①实例与数据库
  • vba:单元格的选择,查找,合并,批注,SpecialCells,图形插入
  • 【内网安全】横向移动域控提权NetLogonADCSPACKDC永恒之蓝
  • 将本地项目上传到远程仓库的步骤
  • selenium+opencv实现模拟登陆(滑块验证码)
  • 辽宁申请互联网医院牌照流程
  • java实现布隆过滤器
  • gitlab部署及整合Jenkins持续构建(三)nexus私服的安装及实战、linux安装mysql
  • 一、Java基础(2)
  • 软件设计师重要知识点——第一章——计算机组成与体系结构
  • 编程学习心得
  • web获取媒体流
  • 代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些、01背包问题,你该了解这些 滚动数组、 416. 分割等和子集
  • 【Android】JNI静态与动态注册介绍
  • 【算法题解】22. 接雨水
  • 集合详解之(四)集合的遍历
  • 【I2C】通用驱动i2c-dev分析
  • 用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~
  • 硬件语言Verilog HDL牛客刷题day03 时序逻辑部分
  • day31 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
  • MobTech 秒验|本机号码一键登录会泄露隐私吗
  • 2023年供销合作社研究报告
  • 【ansible】实施任务控制
  • 49天精通Java,第11天,java接口和抽象类的异同,default关键字
  • JAVA练习99-逆波兰表达式求值
  • 恶意软件、恶意软件反杀技术以及反病毒技术的详细介绍
  • 【数据库运维】mysql备份恢复练习
  • 刷题30-对称的二叉树
  • 精选简历模板
  • 蓝桥杯嵌入式第十三届客观题解析