二叉树知识锦囊(二)

news2024/9/29 23:26:51

作者:爱塔居

专栏:数据结构

作者简介:大三学生,希望和大家一起进步!

文章目录

文章目录

一、二叉树的存储

二、二叉树的遍历(重点)

2.1 前序遍历

 2.2 中序遍历

 2.3 后序遍历

2.4 层序遍历

 2.5 小题实练

三、代码实现


一、二叉树的存储

二叉树的存储结构分为:顺序存储和类似于链表的链式存储。

二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方法。

二、二叉树的遍历(重点)

遍历是指沿着某条搜索路线,依次对树中的每个节点,均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。

2.1 前序遍历

前序遍历:根结点》左子树》右子树

前序遍历:

 从A开始,打印A往左走,遍历到B,打印B,再遍历B的左子树D,打印D,接着遍历D的左子树,发现为空,返回D,再遍历D的右子树G,打印G,遍历G的左右子树都为空,返回G,返回D,返回B,遍历B的右子树为空,返回B,返回A。A\rightarrow B\rightarrow D\rightarrow G

 再遍历A的右子树C,打印C,遍历C的左子树F,打印F,再遍历F的左右子树为空,返回F,返回C,再遍历C的右子树K,打印K,遍历K的左右子树为空,返回K,返回C,返回A。C\rightarrow F\rightarrow K

所以这个二叉树的前序遍历为A\rightarrow B\rightarrow D\rightarrow G\rightarrow C\rightarrow F\rightarrow K

 2.2 中序遍历

中序遍历:左子树》根》右子树

从A开始,到A的左子树B,遍历B的左子树D,遍历D的左子树为空,返回D,打印D,遍历D的右子树G,遍历G的左子树为空,返回G,打印G,遍历G的右子树为空,返回G,返回D,返回B,打印B,遍历B的右子树为空,返回B,返回A,打印AD\rightarrow G\rightarrow B\rightarrow A

再遍历A的右子树C,遍历C的左子树F,遍历F的左子树为空,返回F,打印F,遍历F的右子树为空,返回F,返回C,打印C,遍历C的右子树K,遍历K的左子树为空,返回K,打印K,遍历K的右子树为空,返回K,返回C,返回A。F\rightarrow C\rightarrow K

故该二叉树的中序遍历为D\rightarrow G\rightarrow B\rightarrow A\rightarrowF\rightarrow C\rightarrow K

 2.3 后序遍历

后序遍历:左子树》右子树》根 

从A开始,遍历A的左子树B,遍历B的左子树D,遍历D的左子树为空,返回D,遍历D的右子树G,遍历G的左右子树为空,返回G,打印G,返回D,打印D,返回B,遍历B的右子树为空,返回B,打印B ,返回A。G\rightarrow D\rightarrow B

遍历A的右子树C,遍历C的左子树F,遍历F的左右子树为空,返回F,打印F,返回C,遍历C的右子树K,遍历K的左右子树为空,返回K,打印K,返回C,打印C,返回A,打印AF\rightarrow K\rightarrow C\rightarrow A

故该二叉树的后序遍历为G\rightarrow D\rightarrow B\rightarrowF\rightarrow K\rightarrow C\rightarrow A

2.4 层序遍历

层序遍历就是自上而下,自左至右访问树的结点的过程。

这个二叉树的层序遍历为A\rightarrow B\rightarrow C\rightarrow D\rightarrow F\rightarrow K\rightarrow G

 2.5 小题实练

1.某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为()
A: ABDHECFG B: ABCDEFGH C: HDBEAFCG D: HDEBFGCA

 因为是完全二叉树,所以我们根据层序遍历的结果可以画出二叉树:

 根据二叉树,我们得出前序遍历结果ABDHECFG

2.二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
A: E B: F C: G D: H

先序遍历第一个结点就是根结点,故为A;

如果这道题要我们画出这个二叉树,我们也可以画出:

 因为中序遍历顺序,根结点的左边结点都是在左边,右边的结点都是在右边。

3.设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
A: adbce B: decab C: debac D: abcde

 根据中序遍历和后序遍历结果画出二叉树图为:

前序遍历结果:abcde

4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
A: FEDCBA B: CBAFED C: DEFCBA D: ABCDEF

层序遍历结果:FEDCBA

🍓那如果知道前序遍历序列和后序遍历序列,我们可以画出二叉树吗?

答案是不行。因为这样,我们只能找到根结点,不能确定左子树和右子树的位置。

三、代码实现

接下来,我们尝试着创建一个二叉树。

public  class TestBinaryTree {
static  class  TreeNode {
    public char val;//数据域
    public TreeNode left;//左孩子节点
    public TreeNode right;//右孩子节点
    public TreeNode(char val) {
        this.val = val;
    }
}
    public TreeNode createTree( ){
        TreeNode A=new TreeNode('A');
        TreeNode B=new TreeNode('B');
        TreeNode C=new TreeNode('C');
        TreeNode D=new TreeNode('D');
        TreeNode E=new TreeNode('E');
        TreeNode F=new TreeNode('F');
        TreeNode G=new TreeNode('G');
        TreeNode H=new TreeNode('H');
        A.left=B;
        A.right=C;
        B.left=D;
        B.right=E;
        C.left=F;
        C.right=G;
        E.right=H;
        return A;
    }

 先序遍历:

public void preOrder(TreeNode root){
        //当二叉树根结点为空
    if(root==null){
        return;
    }
    //不为空,打印树的根结点的值
    System.out.print(root.val+" ");
    //这时对左子树进行先序遍历,又是新的二叉树
    preOrder(root.left);
    preOrder(root.right);
}

中序遍历:

void inOrder(TreeNode root){
        if(root==null){
    return;
}
        inOrder(root.left);
    System.out.print(root.val+" ");
        inOrder(root.right);
}

 后序遍历:

void postOrder(TreeNode root){
    if(root==null){
        return;
    }
    inOrder(root.left);
    inOrder(root.right);
    System.out.print(root.val+" ");
}

完整代码见链接:javacode: java的日常代码---------------------- - Gitee.com 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174398.html

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

相关文章

AX7A200教程(2): DDR3仿真平台搭建(二)

本章主要新建ddr3工程,然后将官方的ddr3仿真文件加入到工程里进行仿真,开发环境2020.1。新建ddr3_test工程新建ddr3工程顶层新建的ddr3_top顶层文件,目前还是空白的调用mig控制器,请参考我上一个章节,这里不在具体写调…

搜索引擎——Elasticsearch

文章目录1.ElasticSearch简介2.基本概念3.Elasticsearch概念-倒排索引4.Elasticsearch和Kibana的安装5.Elasticsearch入门操作5.1_cat5.2PUT&POST新增数据5.3PUT&POST修改数据5.4GET查询数据5.5DELETE删除数据5.7bulk批量操作5.6乐观锁字段6.Elasticsearch进阶操作6.1批…

蓝桥杯重点(C/C++)(随时更新)

目录 1 重点 1.1 取消同步(节约时间,甚至能多骗点分,最好每个程序都写上) 1.2 万能库(可能会耽误编译时间,但是省脑子) 1.3 蓝桥杯return 0千万别忘了写!! 1.4 …

【nginx】Windows下的常见问题踩坑

▒ 目录 ▒🛫 导读需求1️⃣ 安装2️⃣ 中文路径3️⃣ alias指定目录错误及原因正确示例📖 参考资料🛫 导读 需求 最近写了一个前端应用,需要部署后,让别人能访问,想来想去,还是选择了目前最强…

TeeChart Pro VCL FMX 2022.36.220929 Crack

TeeChart Pro VCL FMX图表组件库提供数百种用于数据可视化的 2D 和 3D 图形样式、56 种数学、统计和财务函数供您选择,还有无限数量的轴和 30 个调色板组件。 快速浏览 跨平台的一个来源 针对 Windows、Web 和移动应用程序 Delphi VCL 图表组件 使用 Embarcadero 的…

elasticsearch搜索功能(二)

一、DSL查询文档(P100) 1. DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: (1)查询所有:查询出所有数据,一…

《Python程序设计(第3版)》[美] 约翰·策勒(John Zelle) 第 9 章 答案

《Python程序设计(第3版)》[美] 约翰策勒(John Zelle) 第 9 章 答案 答案仅供参考,若有错误欢迎指正 判断对错 计算机可以生成真正的随机数。Python 的 random 函数返回伪随机整数。自顶向下的设计也称为逐步求精。…

Redis优惠券秒杀 | 黑马点评

目录 一、全局唯一ID 1、全局ID生成器 二、实现秒杀下单 1、基本的下单功能 2、超卖问题 3、乐观锁解决并发问题 三、实现一人一单 1、思路分析 2、代码初步实现 3、关于锁的范围 4、关于事务失效 5、集群下线程并发问题 一、全局唯一ID 订单如果用自增长会存在…

QT动画实例代码QPropertyAnimation的应用

用QT实现动画,我们必定用到QPropertyAnimation,这里我们介绍几种情形的动画实现。如直线动画,曲线动画,路径动画。 一、基础知识 1、QPropertyAnimation的初始化 我们首先必须在包涵QPropertyAnimation的头文件或者模块&#x…

Android之WorkManager处理后台定时任务

WorkManager和Service并不相同,也没有直接的联系。Service是Android系统四大组件之一,它没有被销毁的情况下是一直保持在后台运行的。而WorkManager只是一个处理定时任务的工具,它可以保证即使在应用退出甚至手机重启的情况下,之前…

动手深度学习-pytorch数据操作

N维数组是机器学习和神经网络的主要数据结构创建数组需要形状:如3*4的矩阵每个元素的类型:例如32位浮点数每个元素的值:例如全是0.或者随机数数据操作首先,导入torch张量表示一个数值组成的数组,这个数组可能有多个维度…

acwing基础课——欧拉函数

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想: 这里我们了解一下欧拉函数是什么以及用筛法求欧拉函数,我们先给出欧拉函数的定义: 然后我们了解一下互质的概念,只要两数的公因…

连你女朋友都能看懂的分布式架构原理!

目录 从一个新闻门户网站案例引入推算一下你需要分析多少条数据?黄金搭档:分布式存储分布式计算 这篇文章聊一个话题:什么是分布式计算系统? 一、从一个新闻门户网站案例引入 现在很多同学经常会看到一些名词,比如分…

CSDN官方模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

数据结构(栈)

目录 栈的定义 形象比喻 栈的相关术语 栈的抽象数据类型(栈Stack的ADT) 顺序栈 顺序栈类的声明 顺序栈类成员函数的实现 基本效率分析 顺序栈的应用(小测试) main.cpp 共享栈 双共享栈 链式栈 链式栈基本操作分析 链…

cf Educational Codeforces Round 134 E. Prefix Function Queries

原题: You are given a string s, consisting of lowercase Latin letters. You are asked q queries about it: given another string t, consisting of lowercase Latin letters, perform the following steps: concatenate s and t; calculate the prefix func…

实战打靶集锦-001-Funbox2

**写在前面:**这应该是本人第一次自主成功完成的打靶,纪念一下下。 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 浏览器访问4.1.2 站点地图查看4.1.3 目录枚举4.1.4 公共EXP搜索4.2 FTP探查4.2.1 手工登录FTP4.2.2 公共EXP搜索…

基于决策树模型和支持向量机模型的手写数字识别

目录 1、导入库和手写数字数据集 2、 把数据可视化 3、把数据分成训练数据集和测试数据集 4、训练SVM模型 5、训练决策树模型 6、对所使用的模型进行评估 7、对手写数字图像进行预测 本项目实现了 第一个功能:可以通过导入库和数据集、通过对数据集的预处理…

JavaScript基础(17)_Function方法(call、apply)、arguments

概念 call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性,可以通过函数对象来调用。 a…

2023牛客寒假算法基础集训营3 赛时思路+正解

这场数学和思维偏多,特别是数学,五个小时过于充实了,而且更加考验你的心态。 这场不乏码量大的毒瘤题,也不乏人类智慧妙妙题。 A 不断减损的时间 题意 给定一个数组aaa,我们可以执行任意次操作,该操作定义…