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

二叉树的后序遍历,力扣

目录

中序遍历

前序遍历 

题目地址:

题目:

我们直接看题解吧:

解题方法:

  注:

解题分析:

解题思路:

代码实现:

代码实现(递归):

代码实现(迭代):



中序遍历

二叉树的中序遍历,力扣-CSDN博客

前序遍历 

二叉树的前序遍历,力扣-CSDN博客

题目地址:

145. 二叉树的后序遍历 - 力扣(LeetCode)

难度:简单

今天刷二叉树的后序遍历,大家有兴趣可以点上看看题目要求,试着做一下

题目:

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

我们直接看题解吧:

解题方法:

方法1、递归

方法2、迭代

方法3、Morris

  注:

有一种巧妙的方法可以在线性时间内,只占用常数空间来实现后序遍历。这种方法由 J. H. Morris 在 1979 年的论文「Traversing Binary Trees Simply and Cheaply」中首次提出,因此被称为 Morris 遍历。

Morri遍历的核心思想是利用树的大量空闲指针,实现空间开销的极限缩减

解题分析:

·后序遍历顺序:左子树->右子树->根节点(即左右根)

·递归方法虽易懂,但效率偏低;迭代方法,虽效率高,但不易理解

  因此这里着重讲一下Morris方法。

解题思路:

1、新建临时节点,令该节点为 root;

2、如果当前节点的左子节点为空,则遍历当前节点的右子节点;

3、如果当前节点的左子节点不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点;

       · 如果前驱节点的右子节点为空,将前驱节点的右子节点设置为当前节点,当前节点更新为当前节点的左子节点。

       ·如果前驱节点的右子节点为当前节点,将它的右子节点重新设为空。倒序输出从当前节点的左子节点到该前驱节点这条路径上的所有节点。当前节点更新为当前节点的右子节点。

4、重复步骤 2 和步骤 3,直到遍历结束。

具体题解可参考->145. 二叉树的后序遍历题解)

代码实现:

class Solution {public List<Integer> postorderTraversal(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) {p2.right = p1;p1 = p1.left;continue;} else {p2.right = null;addPath(res, p1.left);}}p1 = p1.right;}addPath(res, root);return res;}public void addPath(List<Integer> res, TreeNode node) {int count = 0;while (node != null) {++count;res.add(node.val);node = node.right;}int left = res.size() - count, right = res.size() - 1;while (left < right) {int temp = res.get(left);res.set(left, res.get(right));res.set(right, temp);left++;right--;}}
}

代码实现(递归):

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

代码实现(迭代):

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if (root == null) {return res;}Deque<TreeNode> stack = new LinkedList<TreeNode>();TreeNode prev = null;while (root != null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (root.right == null || root.right == prev) {res.add(root.val);prev = root;root = null;} else {stack.push(root);root = root.right;}}return res;}
}

相关文章:

  • Spring Boot快速搭建一个简易商城项目【完成登录功能且优化】
  • Axure医疗-住院板块,住院患者原型预览,新增医护人员原型预览,新增病房原型预览,选择床位原型预览,主治医生原型预览,主治医生医嘱原型预览
  • Mybaits-plus快速入门
  • 大学生必备的15个网站,大学生考试报名,大学生自学网站!
  • SortedMap、NavigableMap
  • SpringSecurity-2.7中跨域问题
  • Vue3 watch 的使用,如何监听一个对象中的属性值的变化 vue3 + ts + vite
  • 长沙竟然有这么多芯片公司!
  • 代码随想录——哈希表 刷题记录
  • python 1200例——【12】选择排序
  • 如何评估 RAG 应用的质量?最典型的方法论和评估工具都在这里了
  • Android : 画布的使用 简单应用
  • 编程笔记 html5cssjs 013 HTML布局
  • PointNet人工智能深度学习简明图解
  • 面试经典150题(59-61)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017前端实习生面试总结
  • CODING 缺陷管理功能正式开始公测
  • Java,console输出实时的转向GUI textbox
  • Java到底能干嘛?
  • js操作时间(持续更新)
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Netty源码解析1-Buffer
  • redis学习笔记(三):列表、集合、有序集合
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 如何合理的规划jvm性能调优
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 写给高年级小学生看的《Bash 指南》
  • 译米田引理
  • 智能合约Solidity教程-事件和日志(一)
  • 走向全栈之MongoDB的使用
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​2020 年大前端技术趋势解读
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​ssh免密码登录设置及问题总结
  • ​比特币大跌的 2 个原因
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (AngularJS)Angular 控制器之间通信初探
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (六)软件测试分工
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)nsfocus-绿盟科技笔试题目
  • ../depcomp: line 571: exec: g++: not found
  • .chm格式文件如何阅读
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net CF下精确的计时器
  • .NET delegate 委托 、 Event 事件
  • .Net 垃圾回收机制原理(二)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET文档生成工具ADB使用图文教程