数据结构之二叉树遍历

news2024/9/20 2:04:17

二叉树的遍历

二叉树

先序遍历

先输入父节点,再遍历左子树和右子树: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.coloradmin.cn/o/2147583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫框架之Scrapy介绍——高效方便

# 近年来大数据分析、数据可视化和python等课程逐渐在大学各个学科中铺展开来&#xff0c;这样一来爬虫在平时小作业和期中、期末报告中出现的频率也逐渐变高。那么单一的使用requests库&#xff0c;自己从头到尾的的设计&#xff0c;考虑数据提取、线程管理和数据存储等方方面…

微服务架构详解

微服务与SOA概述 SOA历史 SOA示例 微服务历史 SOA 被抛弃了么? 微服务与 SOA 剖析 SOA 架构剖析 ESB就是一个一个微服务的功能 ESB 功能举例 对象转换还有逻辑转换 很多东西都要在ESB里面处理 微服务剖析 把一个单体结构拆分多个小服务。为了让小服务之间通信方便&#x…

用AI的智慧,传递感恩之心——GPT-4o助力教师节祝福

随着科技的飞速发展&#xff0c;人工智能在我们生活中的应用日益广泛。在这个教师节&#xff0c;不仅可以用传统的方式表达对老师的感恩之情&#xff0c;还可以借助OpenAI最新推出的GPT-4o模型&#xff0c;生成独特而温暖的祝福语和精美海报&#xff0c;让我们的感恩显得更加与…

Renesas R7FA8D1BH (Cortex®-M85)的UART使用介绍

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP配置UART 2.1 配置参数 2.2 UART模块介绍 3 接口函数介绍 3.1 R_SCI_B_UART_Open() 3.2 R_SCI_B_UART_Close() 3.3 R_SCI_B_UART_Read() 3.4 R_SCI_B_UART_Write() 3.5 R_SCI_B_UAR…

【iOS】——JSONModel源码

JSONModel用法 基本用法 将传入的字典转换成模型&#xff1a; 首先定义模型类&#xff1a; interface Person : JSONModel property (nonatomic, copy) NSString *name; property (nonatomic, copy) NSString *sex; property (nonatomic, assign) NSInteger age; end接…

Java 23 的12 个新特性!!

Java 23 来啦&#xff01;和 Java 22 一样&#xff0c;这也是一个非 LTS&#xff08;长期支持&#xff09;版本&#xff0c;Oracle 仅提供六个月的支持。下一个长期支持版是 Java 25&#xff0c;预计明年 9 月份发布。 Java 23 一共有 12 个新特性&#xff01; 有同学表示&…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5&#xff1a;阿里巴巴集团的新一代大型语言模型 摘要&#xff1a; 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

「数据科学」清洗数据,使用Python语言处理数据集中的重复值

数据集中的重复值&#xff0c;产生的原因有很多&#xff0c;如果不进行处理的话&#xff0c;会对我们的后续分析过程&#xff0c;产生很大的影响。比如说&#xff0c;在统计汇总数据的时候&#xff0c;重复数据就会导致数据总数增多。要是重复数据多的话&#xff0c;会影响我们…

2024 go-zero社交项目实战

背景 一位商业大亨&#xff0c;他非常看好国内的社交产品赛道&#xff0c;想要造一款属于的社交产品&#xff0c;于是他找到了负责软件研发的小明。 小明跟张三一拍即合&#xff0c;小明决定跟张三大干一番。 社交产品MVP版本需求 MVP指&#xff1a;Minimum Viable Product&…

Java自定义集合-基于文件的泛型列表 LocalFileArrayList

Java实现基于文件的泛型列表 LocalFileArrayList 简介核心概念泛型文件操作实现细节构造函数读取和写入文件类型转换List 接口方法实现总结调用示例完整代码简介 LocalFileArrayList我自己随便起的,没怎么思考,不一定是最适合的名字。搞这东西主要是有些需求用到的数据量太大…

95分App引领年轻人省钱赚钱新风尚,闲置也能变宝藏

随着时代的发展&#xff0c;年轻一代的消费观念正经历着深刻的变革。他们不再盲目追求新品、奢侈品&#xff0c;而是喜欢上购买闲置物品来满足日常所需。在消费的同时&#xff0c;加入了卖家的行列。对自己拥有的闲置物品开启“断舍离”&#xff0c;纷纷在闲置平台进行售卖。这…

鸿蒙媒体开发系列05——音频并发播放管理与音量管理

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、多音频播放的并发管理 多音频并发&#xff0c;即多个音频流同时播放。此场景下&…

GAMES104:15 游戏引擎的玩法系统基础-学习笔记

文章目录 0&#xff0c;游戏性课程框架一&#xff0c;事件机制1.1 事件的定义1.2 callback的注册1.3 事件的分发系统 二&#xff0c;游戏逻辑与脚本系统2.1 特点和常见脚本语言2.2 脚本语言的GO管理2.3 脚本语言的架构2.4 可视化脚本 三&#xff0c;Gameplay 开发中的3C &#…

关雅荻发文批评某脱口秀节目审核问题:为博流量乱搞事情?

最近&#xff0c;针对某脱口秀节目中引发的网络舆情&#xff0c;电影制片人关雅荻发文严厉批评该视频平台的审核问题&#xff0c;指出“这家视频网站对应的节目审核环节严重失职&#xff0c;或者有意渎职&#xff0c;这个脱口秀节目制作方在自己内容策划和制作也有明显失职、严…

一招有效清理宠物浮毛,养宠搭子——质量好的宠物空气净化器推荐

害&#xff0c;好不容易毕业找到了工作进入社会&#xff0c;我以为可以自己决定事情了&#xff0c;结果上周又被我妈臭骂一通。因为我瞒着他们养猫了&#xff0c;他们来看我的时候才知道&#xff0c;说我刚出来养活自己都够呛&#xff0c;哪里还能照顾猫。在我好说歹说下&#…

数字电路与逻辑设计-触发器功能测试及其应用

一、实验目的 1&#xff0e;验证基本RS、JK、D、T和T’触发器的逻辑功能及使用方法&#xff1b; 2&#xff0e;能进行触发器之间的相互转换&#xff1b; 3&#xff0e;学习触发器的一些应用。 二、实验原理 触发器具有两个能够自行保持的稳定状态&#xff0c;用以表示逻辑状…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目&#xff0c;它允许用户在C中实现与LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型&#xff0c;虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重&#xff0c;但它…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置&#xff0c;进入虚拟机设置 3.启动虚拟机&#xff0c;进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

MYSQL解说

MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛用于网站和应用程序的后端数据存储。 MySQL的基础知识&#xff1a; 1. 数据库和表 数据库&#xff08;Database&#xff09;&#xff1a;存储数据的逻辑容器。表&#xff08;Table&…

JAVA——打印流

目录 一、printStream 二、printWriter 三、打印流的应用——输出重定向 输出语句重定向的意义 一、printStream 1. 作用&#xff1a; 打印流可以实现更方便、更高效的打印数据出去 跟着黑马实现一下&#xff1a;printStream 的底层实现效率更高&#xff0c;println输什么…