数据结构之二叉树的遍历

news2024/11/17 13:35:55

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构(或物理结构)。数据结构按照逻辑关系的不同分为线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
  二叉树是 n(n≥0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的且分别称为左、右子树的二叉树所组成。可见,二叉树具有递归性质。
  遍历是按某种策略访问树中的每个结点,且仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由根结点、左子树和右子树三部分构成的,因此若能依次遍历这三部分,也就遍历了整棵二叉树。按照先遍历左子树后遍历右子树的约定,根据访问根结点位置的不同,可得到二叉树的先序、中序和后序3种遍历方法。此外,对二叉树还可进行层序遍历。
  【函数】二叉树的先序遍历。

void PreOrder(BiTree root){
	if (root != NULL) {
		printf("%d", root->data);	/*访问根结点*/
		PreOrder(root->lchild);		/*先序遍历根结点的左子树*/
		PreOrder(root->rchild);		/*先序遍历根结点的右子树*/
	}/*if*/
}/*PreOrder*/

  【函数】二叉树的中序遍历。

void InOrder(BiTree root){
	if (root != NULL){
		InOrder(root->lchild);		/*中序遍历根结点的左子树*/
		printf("%d", root->data);	/*访问根结点*/
		InOrder(root->rchild);		/*中序遍历根结点的右子树*/
	}/*if*/
}/*InOrder*/

  【函数】二叉树的后序遍历

void PostOrder(BiTree root){
	if(root != NULL) {
		PostOrder(root->lchild);	/*后序遍历根结点的左子树*/
		PostOrder(root->rchild);	/*后序遍历根结点的右子树*/
		printf("%d", root->data);	/*访问根结点*/
	}/*if*/
}/*PostOrder*/

  从根结点出发,3种方法的遍历路线如下图所示。该路线从根结点出发,逆时针沿着二叉树的外缘移动,对每个结点均途经三次。若第一次经过结点时进行访问,则是先序遍历;若第二次(或第三次)经过结点时访问结点,则是中序遍历(或后序遍历)。因此,只要将遍历路线上所有在第一次、第二次和第三次经过的结点信息分别输出,即可分别得到该二叉树的先序、中序和后序遍历序列。所以,若去掉 3 种遍历算法中的打印输出语句,则3种遍历方法相同。这说明3种遍历过程的路线相同。
在这里插入图片描述

  遍历二叉树的基本操作就是访问结点,不论按照哪种次序遍历,对于含有 n 个结点的二叉树,遍历算法的时间复杂度都为 O(n)。因为在遍历的过程中,每进行一次递归调用,都是将函数的“活动记录”压入栈中,因此,栈的最大长度恰为树的高度。所以,在最坏情况下,二叉树是有n个结点且高度为n的单枝树,遍历算法的空间复杂度也为(n)。
  借助于一个栈,可将二叉树的递归遍历算法转换为非递归算法。下面给出中序遍历的非递归算法。
  【函数】二叉树的中序非递归遍历算法。

int InOrderTraverse(BiTree root){			/*二叉树的非递归中序遍历算法*/
	BiTree p;
	InitStack(St);							/*创建一个空栈*/
	p=root;									/*p指向树根结点*/
	while (p != NULL || !isEmpty(St)) {
		if (p!= NULL) {						/*不是空树*/
			Push(St, p);					/*根结点指针入栈*/
			p = p->lchild;					/*进入根的左子树*/
		} else {
			q=Top(St);	Pop(St);			/*栈顶元素出栈*/
			printf("%d", q->data);			/*访间根结点*/
			p = q->rchild;					/*进入根的右子树*/
		}/*if*/
	}/*while*/
}/*InOrderTraverse*/

  遍历二叉树的过程实质上是按一定的规则将树中的结点排成一个线性序列的过程,因此遍历操作得到的是树中结点的一个线性序列。在每一种序列中,有且仅有一个起始点和一个终结点,其余结点有且仅有唯一的直接前驱和直接后继。显然,关于结点的前驱和后继的讨论是针对某一个遍历序列而言的。
  对二叉树还可以进行层序遍历。设二叉树的根结点所在的层数为1,层序遍历就是从树的根结点出发,首先访问第一层的树根结点,然后从左到右依次访问第二层上的结点,其次是第三层上的结点,依此类推,自上而下、自左至右逐层访问树中各结点的过程就是层序遍历。
  【算法】二叉树的层序遍历算法。

void LevelOrder(BiTree root){		/*二叉树的层序遍历算法*/
	BiTree p;
	InitQueue(Q);					/*创建一个空队列*/
	EnQueue(Q, root);				/*将根指针加入队列*/
	while (!isEmpty(Q)){			/*队列不空*/
		DeQueue(Q, p);				/*队头元素出队,并使p取队头元素的值*/
		printf("%d", p->data);		/*访问结点*/
		if (p->lchild)	EnQueue(p->lchild);
		if (p->rchild)	EnQueue(p->rchild);
	}/*while*/
}/*LevelOrder*/
		

  
  
  

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

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

相关文章

BPM、低代码和人工智能:实现灵活、创新与转型的关键结合

随着零售业格局的不断演变,零售商正被迫在一个日益活跃、竞争日益激烈的客户驱动型市场中展开竞争。随着互联网上产品信息和评论的出现,消费者的态度发生了巨大的变化——购物者不再依赖销售人员来获取信息。他们现在知道的和许多零售销售人员一样多&…

解决 BeanUtil.copyProperties 不同属性直接的复制

1、引入hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version> </dependency> hutool官网 2、直接上例子 对象&#xff1a;User.java Data public class User {p…

一文了解Ceph原理以及常见ceph指令

一、Ceph介绍 什么是分布式存储&#xff1f; 与集中式存储相反&#xff0c;分布式存储通常采用存储单元集群的形式。并且具有在集群节点之间进行数据同步和协调的机制。其目的是为了通过服务器解决大规模&#xff0c;高并发情况下的Web访问问题。 Ceph是一个统一的、分布式的存…

2017年认证杯SPSSPRO杯数学建模D题(第二阶段)教室的合理设计全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 D题 教室的合理设计 原题再现&#xff1a; 某培训机构租用了一块如图&#xff08;见附件&#xff09;所示的场地&#xff0c;由于该机构开设了多种门类的课程&#xff0c;所以需要将这块场地通过加入一些隔墙来分割为多个独立的教室和活动区。…

数据目录驱动测试——深入探讨Pytest插件 pytest-datadir

在软件测试中,有效管理测试数据对于编写全面的测试用例至关重要。Pytest插件 pytest-datadir 提供了一种优雅的解决方案,使得数据目录驱动测试变得更加简单而灵活。本文将深入介绍 pytest-datadir 插件的基本用法和实际案例,助你更好地组织和利用测试数据。 什么是pytest-da…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 这张尽量结合上一章进行使用&#xff1a;上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现&#xff1a; 技术&#xff1a;golang&#xff0c;redis&#xff0c;数据结构 …

github 推送报错 ssh: connect to host github.com port 22: Connection timed out 解决

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

未来已来:概念车展漫游可视化的震撼之旅

随着科技的飞速发展&#xff0c;汽车行业正经历着前所未有的变革。而在这场变革中&#xff0c;概念车展无疑是一个引领潮流、展望未来的重要舞台。 想象一下&#xff0c;你站在一个巨大的展厅中&#xff0c;四周陈列着各式各样的概念车。它们有的造型独特&#xff0c;有的功能先…

[BJDCTF2020]ZJCTF,不过如此(特详解)

php特性 1.先看代码&#xff0c;提示了next.php&#xff0c;绕过题目的要求去回显next.php 2.可以看到要求存在text内容而且text内容强等于后面的字符串&#xff0c;而且先通过这个if才能执行下面的file参数。 3.看到用的是file_get_contents()函数打开text。想到用data://协…

真心话大冒险!关于自动驾驶的现状和未来,Mobileye的回答是?

过去的十年&#xff0c;可以说是从主动安全、辅助驾驶到自动驾驶快速演进的周期。这其中&#xff0c;无论是技术迭代&#xff0c;还是成本优化&#xff0c;以及技术和商业化路线的争论&#xff0c;备受行业关注。 同时&#xff0c;市场上的声音&#xff0c;也很多。有激进、谨慎…

详细Nginx和PHP-FPM的进程间通信使用

工作中考虑到PHP-FPM效率&#xff0c;发现PHP-FPM和NGINX的进程通信不止配置端口这一种方式:bowtie: Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Socket. 其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同…

基于YOLOv8的摔倒行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:通过实战基于YOLOv8的摔倒行为检测算法&#xff0c;从数据集制作到模型训练&#xff0c;最后设计成为检测UI界面 人体行为分析AI算法&#xff0c;是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算…

linux基础指令【中篇】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 补充上篇的细节1.sta…

C#~Winform代码调整快捷键

右移 选中要移动的代码 -> Tab 结果&#xff1a; 左移 选中要移动的代码 -> ShiftTab 结果&#xff1a; 自动调整 选中需要调整的代码 -> CtrlKD 调整后&#xff1a;

论文解读--Wideband 120 GHz to 140 GHz MIMO Radar:System Design and Imaging Results

120~140GHz宽带MIMO雷达&#xff1a;系统设计和成像结果 摘要 本文提出了一种工作频率在120 GHz ~ 140 GHz之间的宽带FMCW MIMO雷达传感器。该传感器基于SiGe技术制造的雷达芯片组&#xff0c;并使用MIMO方法来提高角度分辨率。MIMO操作通过发射机的时域复用实现。该雷达能够通…

[蓝桥杯]真题讲解:冶炼金属(暴力+二分)

蓝桥杯真题视频讲解&#xff1a;冶炼金属&#xff08;暴力做法与二分做法&#xff09; 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 视频讲解 二、暴力代码 //暴力代码 #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << &qu…

Python 中的多进程(01/2):简介

一、说明 本文简要而简明地介绍了 Python 编程语言中的多处理&#xff08;多进程&#xff09;。解释多处理的基本信息&#xff0c;如什么是多处理&#xff1f;为什么用多处理&#xff1f;在python中怎么办等。 二、什么是多处理&#xff1f; 多处理是指系统同时支持多个处理器的…

【Android】Android中的系统镜像由什么组成?

文章目录 总览Boot Loader 的加锁与解锁Boot 镜像内核RAM diskARM 中的设备树 (Device Tree) /System 和/Data 分区镜像参考 总览 各种Android设备都只能刷专门为相应型号的设备定制的镜像。 厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。 一个完…

Obsidian - 使用小记(Typora切换过来)

文章目录 关于 Obsidian打开已有的 文件夹将图片改为 Typora 的保存文件夹 关于 Obsidian 官网 https://obsidian.md/github : https://github.com/obsidianmd 个人版免费 一直习惯用 Typora 编写markdown git 记录笔记&#xff0c;多次被安利 Obsidian 后&#xff0c;今天尝…

OFD格式文件预览解决方案

问题 项目中文件预览统一采用的是pc端转pdf后在移动端上面采用Pdfview这个组件进行查看&#xff0c;现后端暂不支持ofd转pdf采用ofd.umd.js查看ofd文件&#xff0c;用WebView直接访问后端给的预览地址会出现跨域问题。 解决办法 拿到pc端预览的ofd.umd.js文件编写预览ofd文件…