【Note】二叉树的遍历

news2024/9/27 23:31:01

二叉树的遍历

二叉树的基本结构:根节点(Data)、左子树(LChild)和右子树(RChild)。

因此只要依次遍历这三部分,就遍历了整个二叉树。

如果用L、D、R分别表示遍历左子树、访问根结点、遍历右子树,那么对二叉树的遍历顺序就可以有以下6种方式:

  1. 访问根,遍历左子树,遍历右子树,记作DLR。
  2. 访问根,遍历右子树,遍历左子树,记作DRL。
  3. 遍历左子树,遍历右子树,访问根,记作LRD。
  4. 遍历左子树,访问根,遍历右子树,记作LDR。
  5. 遍历右子树,遍历左子树,访问根,记作RLD。
  6. 遍历右子树,访问根,遍历左子树,记作RDL。

在以上6种遍历的方式中,如果规定按先左后右的顺序,那么就只剩下DLR、LDR和LRD三种。根据对根的访问先后顺序不同,分别称为DLR为先序遍历或先根遍历,LDR为中序遍历(对称遍历),LRD称为后序遍历。

注意,先序、中序、后序遍历都是递归定义的。

先序遍历(DLR)操作过程

若二叉树为空,则为空操作,否则依次执行如下三个操作:

  1. 访问根结点;
  2. 按先序遍历左子树;
  3. 按先序遍历右子树。

先序遍历实例

 

先序遍历实例解析:

  • 先序遍历的本质是:以根结点为准,先遍历根结点;
  • 然后在根结点的基础上,再依次遍历根结点左子树和右子树;
  • 注意这里必须是要将根结点上的所有左子树都遍历完之后,再遍历根结点的右子树;
  • 其中若是根结点的左子树还有很多结点,那么仍然是先遍历左子树,再遍历右子树。

答案:-+a*b-cd/ef

中序遍历(LDR)操作过程

若二叉树为空,则为空操作,否则依次执行如下三个操作:

  1. 按中序遍历左子树;
  2. 访问根结点;
  3. 按中序遍历右子树。

后序遍历(LRD)操作过程

若二叉树为空,则为空操作,否则依次执行如下三个操作:

  1. 按后序遍历左子树;
  2. 按后序遍历右子树;
  3. 访问根结点。

二叉树的遍历是一个递归过程

遍历实例一

先序遍历:ABDFGCEH

中序遍历:BFDGACEH

后序遍历:FGDBHECA

遍历实例二

 

先序遍历:-+a*bc/de

中序遍历:a+b*c-d/e

后序遍历:abc*+de/-

遍历实例三

 

先序遍历:ABDGCEFH

中序遍历:DGBAECHF

后序遍历:GDBEHFCA

先中后序遍历必会练习题

练习:已知一棵二叉树的中序序列和后序序列分别为BDCEAFHG和DECBHGFA,画出这棵二叉树。

数的层次遍历利用队列来实现

算法思路

遍历从二叉树的根结点开始,首先将根结点入队列,然后指向下面的操作:

  1. 取出对头元素;
  2. 访问该元素所指结点;
  3. 若该元素所指结点的左、右孩子结点非空,则将该元素所指向结点的左孩子指针和右孩子指针入队。
  4. 若队列非空,重复前三步;当队列为空时,二叉树层次遍历结束。

层次遍历

二叉树的层次遍历:是指从二叉树的第一层(根结点开始),从上到下逐层遍历,在同一层中,按从左到右的顺序对结点逐个进行访问。

层次遍历实例

遍历结果:-+/a*efb-cd 

二叉树的层次遍历算法

void LevelOrder(BiTree bt)  //层次遍历二叉树bt算法
{
    初始化队列;
    if(bt==NULL)   return;
    bt入队列Q;
    while(队列Q不空)
    {
        p←出队元素;
        Visit(p);          //访问出队结点
        if(p->lchild)      //队首结点左孩子不空,入队
        {
            p->lchild入队Q
        }
        if(p->rchild)      //队首结点左孩子不空,入队
        {
            p->rchild入队Q
        }
    }
}

创建二叉树总结

结合先序遍历序列和中序遍历序列创建二叉树

基本思路:先序遍历的第一个结点一定是二叉树的根结点,而根据中序遍历规则,这个结点将同一棵二叉树的中序遍历序列分成了左、右两部分,左边部分是二叉树的根结点的左子树的中序遍历序列,右边部分是二叉树的根结点的右子树的中序遍历序列。根据这两个子序列,在先序序列中找到对应的子序列,左子序列的第一个结点为左子树的根结点,右子序列的第一个结点为右子树的根结点。对左右子树,在反复利用这个方法,最终根据先序序列和中序序列能唯一地确定出一棵二叉树。

结合“扩展先序遍历序列”创建二叉树

扩展先序遍历序列:就是先对原有二叉树用空子树进行扩展,使每个结点的左右子树(包括空子树)都存在,然后再对扩展后的二叉树进行先序遍历。遍历序列中用特定的符号表示空子树。

其扩展先序遍历序列为:

589007006034000

其中,“0”表示空子树。

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

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

相关文章

不用编程超简单的自动化测试工具:Airtest入门篇教程!

目录 一、背景 二、什么是Airtest 三、Airtest下载安装 四、Airtest入门使用教程 4.1 连接设备: 4.2 具体测试场景案例: 五、总结 一、背景 很多刚入行或从其他行业转行做测试的同学,日复一日每天做点工已经点得疲惫和麻木&#xff0…

SparkSQL执行流程与Catalyst优化器

目录 一、SparkSQL运行流程与Catalyst优化器 (1)RDD运行流程 (2)SparkSQL自动优化 (3)Catalyst优化器流程 (4)Catalyst优化器总结 (5)Spark SQL执行流程 一、…

Leo赠书活动-02期 【信息科技风险管理:合规管理、技术防控与数字化】

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…

五、W5100S/W5500+RP2040树莓派Pico<UDP Client数据回环测试>

文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP Client回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来…

Premiere Pro(Pr)2023软件下载及安装教程

目录 一.简介 二.安装步骤 软件:Pr版本:2023语言:简体中文大小:8.30G安装环境:Win11/Win10(1809版本以上)硬件要求:CPU2.6GHz 内存8G(或更高,不支持7代以下CPU&#xf…

Android系统启动

首语 Android系统启动与应用启动、四大组件、AMS等很多内容都有关联,因此,Android系统启动是首先需要了解的知识。 Android 系统启动流程 Android系统流程主要部分如上图所示。下面对各个流程进行解析。 Boot ROM 启动电源以及系统启动。当电源按下时…

启动1000万个虚拟线程需要多少时间?需要多少平台线程?

之前,在Java新特性专栏中,我们简单介绍了Java 21正式发布的虚拟线程。 昨天,正好看到一个讲解此内容的视频,非常不错,所以DD这里给大家翻译好了,感兴趣的可以看看。可以进一步了解虚拟线程。 什么是虚拟线…

二进制搭建 Kubernetes+部署网络组件+部署CornDNS+负载均衡部署+部署Dashboard

二进制搭建 Kubernetes v1.20 k8s集群master01:20.0.0.50 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02:20.0.0.100k8s集群node01:20.0.0.110 kubelet kube-proxy docker etcd k8s集群node02:20.…

ArcGIS笔记12_ArcGIS搜索工具没法用?ArcGIS运行很慢很卡?

本文目录 前言Step 1 ArcGIS搜索工具没法用Step 2 ArcGIS运行很慢很卡 前言 这是笔者最近遇到的两个小问题,新换了台式机,安装上ArcGIS后发现搜索工具没法用,而且感觉还不如原来笔记本运行的流畅,加载图层很慢,编辑要…

基于YOLOv8模型和UA-DETRAC数据集的车辆目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型和UA-DETRAC数据集的车辆目标检测系统可用于日常生活中检测与定位汽车(car)、公共汽车(bus)、面包车(vans)等目标,利用深度学习算法可实现图片、视频、摄像头等方…

μCOS-Ⅲ中断管理,这样理解非常简单!

μCOS-Ⅲ中断管理,这样理解非常简单! 文章目录 μCOS-Ⅲ中断管理,这样理解非常简单!前言一、中断源与中断优先级二、μCOS-Ⅲ的中断管理方式三、中断屏蔽与中断控制1、μCOS-Ⅲ中断开关2、μCOS-Ⅲ中断屏蔽应用——临界区4、μCOS…

sqoop和flume简单安装配置使用

1. Sqoop 1.1 Sqoop介绍 Sqoop 是一个在结构化数据和 Hadoop 之间进行批量数据迁移的工具 结构化数据可以是MySQL、Oracle等关系型数据库 把关系型数据库的数据导入到 Hadoop 与其相关的系统 把数据从 Hadoop 系统里抽取并导出到关系型数据库里 底层用 MapReduce 实现数据 …

Linux区分文件类型,file指令,目录权限,umask掩码,共享文件,Linux中的一些有趣指令

file指令,Linux区分文件类型,目录权限,umask掩码,共享文件,Linux中的一些有趣指令 1.Linux中是如何区分文件类型的2. file指令3.目录权限4.umask掩码5.粘滞位6.Linux中的一些有趣指令 所属专栏:Linux学习❤…

计算机网络-TCP协议

面向连接的运输:TCP TCP连接 TCP被称为面向连接的,因为在应用程序开始互传数据之前,TCP会先建立一个连接,该连接的建立涉及到三次“握手”。 TCP的连接不是一条真实存在的电路,而是一条逻辑链接,其共同状…

EL表达式和JSTL标签库

2023.10.25 EL表达式是什么&#xff1f; EL表达式&#xff0c;Expression Language&#xff08;表达式语言&#xff09;&#xff0c;可以代替JSP中的java代码&#xff0c;让JSP文件中的程序看起来更加整洁&#xff0c;美观。 由于JSP中夹杂着各种java代码&#xff0c;例如<…

MySQL---表的增查改删(CRUD进阶)

文章目录 数据库约束表的设计一对一一对多多对多 新增查询聚合查询分组查询联合查询内连接外连接自连接子查询合并查询 数据库约束 数据库约束就是指&#xff1a;程序员定义一些规则对数据库中的数据进行限制。这样数据库会在新增和修改数据的时候按照这些限制&#xff0c;对数…

[ACTF2020 新生赛]Exec

【解题过程】 1.打开链接 得到一个能ping 的网站&#xff0c;可以推测这个可以在终端运行的网站。 2.解题思路 在执行的时候我们可以想到命令执行的“&#xff1b;”分号的作用&#xff1a;命令用分号分隔开来&#xff0c;表示它们是两个独立的命令&#xff0c;需要依次执行。…

【Docker】Docker的网络

Docker提供了多种内置的网络模式&#xff0c;用于在容器之间建立网络连接。这些网络模式&#xff0c;包括桥接网络、主机网络、无网络模式。我们将主要探讨每种网络模式的优缺点、适用场景。 桥接网络 桥接网络是Docker的默认网络模式。在桥接网络中&#xff0c;Docker会为每…

Pytorch代码入门学习之分类任务(一):搭建网络框架

目录 一、网络框架介绍 二、导包 三、定义卷积神经网络 3.1 代码展示 3.2 定义网络的目的 3.3 Pytorch搭建网络 四、测试网络效果 一、网络框架介绍 网络理解&#xff1a; 将32*32大小的灰度图片&#xff08;下述的代码中输入为32*32大小的RGB彩色图片&#xff09;&…