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

数据结构之二叉树遍历

二叉树的遍历

二叉树

先序遍历

先输入父节点,再遍历左子树和右子树:A、B、D、E、C、F、G

中序遍历

先遍历左子树,再输出父节点,再遍历右子树:D、B、E、A、F、C、G

后序遍历

先遍历左子树,再遍历右子树,最后输入父节点:D、E、B、F、G、C、A

核心理论

  • 根据父节点的输出顺序来确定先序、中序、后续。
  • 采用递归的方式对左子树和右子树进行遍历。
    • 每次递归都是一个方法的入栈操作,直至到最后一个子节点为空的时候,执行方法,然后方法栈弹出。
    • 每个方法栈弹出后,开始执行下一个方法栈,以此类推,相应的方法则可输出。

代码实现

package org.example.data.structure.basetree;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** @author xzy* @since 2024/9/16 15:14*/
public class PersonNode {private static final List<Person> PRE_ORDER_LIST = new ArrayList<>();private static final List<Person> MID_ORDER_LIST = new ArrayList<>();private static final List<Person> POST_ORDER_LIST = new ArrayList<>();private Person data;private PersonNode left;private PersonNode right;public PersonNode() {}public PersonNode(Person person) {this.data = person;}public PersonNode(Person data, PersonNode left, PersonNode right) {this.data = data;this.left = left;this.right = right;}/*** 前序遍历*/public List<Person> preOrder() {PRE_ORDER_LIST.add(this.getData());if (Objects.nonNull(this.getLeft())) {this.getLeft().preOrder();}if (Objects.nonNull(this.getRight())) {this.getRight().preOrder();}return PRE_ORDER_LIST;}/*** 中序遍历*/public List<Person> midOrder() {if (Objects.nonNull(this.getLeft())) {this.getLeft().midOrder();}MID_ORDER_LIST.add(this.getData());if (Objects.nonNull(this.getRight())) {this.getRight().midOrder();}return MID_ORDER_LIST;}/*** 后续遍历*/public List<Person> postOrder() {if (Objects.nonNull(this.getLeft())) {this.getLeft().postOrder();}if (Objects.nonNull(this.getRight())) {this.getRight().postOrder();}POST_ORDER_LIST.add(this.getData());return POST_ORDER_LIST;}public Person getData() {return data;}public void setData(Person data) {this.data = data;}public PersonNode getLeft() {return left;}public void setLeft(PersonNode left) {this.left = left;}public PersonNode getRight() {return right;}public void setRight(PersonNode right) {this.right = right;}
}

源码与测试案例

gitee地址


http://www.mrgr.cn/news/30417.html

相关文章:

  • 【Python】轻松实现机器翻译:Transformers库使用教程
  • 17RAL_Visual-Inertial Monocular SLAM with Map Reuse
  • DNS Resolver解析服务器出口IP查询
  • Vivado+Vscode联合打造verilog环境
  • kali基础命令2完结版---清风
  • 道可云人工智能元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
  • 字节推音乐生成神器 Seed-Music 支持多样化输入和精确控制
  • C++初阶学习第六弹------标准库中的string类
  • 【新手上路】衡石分析平台使用手册-认证方式
  • 关于Java数据结构中集合的一个小知识
  • python 函数简记
  • 【iOS】KVC
  • 95分App引领年轻人省钱赚钱新风尚,闲置也能变宝藏
  • 内存管理篇-27寄存器映射:ioremap
  • 打工人、设计师必备的AI抠图工具
  • 索引的介绍
  • 音视频入门基础:AAC专题(10)——FFmpeg源码中计算AAC裸流每个packet的pts、dts、pts_time、dts_time的实现
  • chapter15-泛型——(自定义泛型)——day20
  • 力扣232:用栈实现队列
  • 【python】多线程
  • Java 之网络编程小案例
  • 前端 Vue.js + 后端 Flask/Django 完美结合:教你打造高效全栈应用的秘诀!
  • OpenGL 原生库1 窗口
  • SDKMAN!关联已安装JDK
  • 3.数据类型
  • 【Webpack--011】配置开发和生产模式的webpack.config.js