数据结构之二叉树的遍历

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构(或物理结构)。数据结构按照逻辑关系的不同分为线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
  二叉树是 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.rhkb.cn/news/245120.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+Email发送邮件

引言 邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送&#xf…

【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、std::shared_ptr的循环引用1. 概念2. 示例分析 二、std::weak_ptr1. 简介2. weak_ptr模板类提供的成员方法3. 使用示例(1)weak_ptr指针的创建(2)完整示例(解决上面循环引用问题) 4. C模拟…

微信小程序(九)轮播图

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.轮播容器的基本属性 2.轮播图片的尺寸处理 index.wxml <view class"navs"><text class"active">精选</text><text>手机</text><text>食品</text…

应用案例:Ruff工业设备数据采集,为生产制造企业数字化转型赋能

导读&#xff1a;某金属材料生产制造企业&#xff0c;引进了整套Ruff数据采集方案&#xff0c;将Ruff网关采集到的PLC数据接入到Ruff IoT管理云平台&#xff0c;帮助客户实现覆盖全厂区、车间所有设备的数字化、可视化管理&#xff0c;避免了意外停机风险&#xff0c;IT运维工作…

C# 实现 Word 加盖骑缝章效果

目录 实现效果 范例运行环境 Office DCOM 配置 设计实现 创建stamp图章类 电子章图片的计算与定位 旋转图片方法 总结 实现效果 在OA的自动化处理系统中&#xff0c;通过审批的最终节点&#xff0c;可能会对WORD文件加盖电子章&#xff0c;比如定位带有指定文字的Ra…

洛谷刷题-【入门2】分支结构

目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …

MySQL(基础篇)——SQL

一.SQL分类 二.DDL(数据定义语言) 1.DDL——数据库操作 ① 查询 查询所有数据库 SHOW DATABASES 查询当前所处数据库 SELECT DATABASE() ② 创建 CREATE DATABASE [IF NOT EXISTS] 数据库名(通常以db结尾) [DEFAULT CHARSET 字符集] [COLLATE 排序规则] ③ …

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述 &#xff08;二&#xff09;.防火墙组网

第04章_IDEA的安装与使用(上)(认识,卸载与安装,JDK相关设置,详细设置,工程与模块管理,代码模板的使用)

文章目录 第04章_IDEA的安装与使用&#xff08;上&#xff09;本章专题与脉络1. 认识IntelliJ IDEA1.1 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA的主要优势&#xff1a;(vs Eclipse)1.4 IDEA 的下载 2. 卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4 注册2…

逻辑回归中的损失函数梯度下降

一、引言 逻辑回归中的损失函数通常采用的是交叉熵损失函数&#xff08;cross-entropy loss function&#xff09;。在逻辑回归中&#xff0c;我们通常使用sigmoid函数将线性模型的输出转换为概率值&#xff0c;然后将这些概率值与实际标签进行比较&#xff0c;从而计算损失。 …

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第 2章感知机

文章目录 第 2章感知机2.1 感知机模型2.2 感知机学习策略2.2.1 数据集的线性可分性2.2.2 感知机学习策略 2.3 感知机学习算法2.3.1 感知机学习算法的原始形式2.3.2 算法的收敛性2.3.3 感知机学习算法的对偶形式 实践&#xff1a;二分类模型&#xff08;iris数据集&#xff09;数…

web漏洞总结大全(基础)

前言 本文章是和cike_y师傅一起写的&#xff0c;cike_y博客&#xff1a;https://blog.csdn.net/weixin_53912233?typeblog 也欢迎大家对本文章进行补充和指正&#xff0c;共同维护这个项目&#xff0c;本文的github项目地址&#xff1a; https://github.com/baimao-box/Sum…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功&#xff0c;当返回值为0时表示成功&#xff0c;否则表示失败或异常&#xff08;非0值&#xff09;。使用专门的测试工具 test 命令&#xff0c;可以对特定条件进行测试&#xff0c;并…

VI / VIM的使用

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且 还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于 x win…

【Linux】糟糕,是心动的感觉——与Linux的初次相遇

初识Linux 导言一、计算机的发展1.1 历史背景1.2 计算机的发明 二、操作系统2.1 什么是操作系统&#xff1f;2.2 操作系统的诞生2.3 操作系统的发展2.3.1 批处理系统的发展2.3.2 分时系统2.3.3 实时系统2.3.4 通用操作系统 2.4 UNIX操作系统2.4.1 UNIX的诞生2.4.2 UNIX的发展 2…

Git学习 -- 分支合并、版本修改相关

目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的…

爬虫正则+bs4+xpath+综合实战详解

Day3 - 1.数据解析概述_哔哩哔哩_bilibili 聚焦爬虫&#xff1a;爬取页面中指定的页面内容 编码流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 数据解析 -> 持久化存储 数据解析分类&#xff1a;正则、bs4、xpath(本教程的重点) 数据解析原理概述&am…

2024年 全新 HTTP 客户端 你用了?

我们平时开发项目的时候&#xff0c;经常会需要远程调用下其他服务提供的接口&#xff0c;于是我们会使用一些 HTTP 工具类比如 Hutool 提供的 HttpUtil。SpringBoot 3.0 出了一个Http Interface的新特性&#xff0c;它允许我们使用声明式服务调用的方式来调用远程接口&#xf…

重磅!Salesforce推出UE+无限版餐套,企业如何选择?

孤立的应用程序和脱节的技术堆栈是所有企业的噩梦。目前&#xff0c;市场上产品和服务种类繁多&#xff0c;无缝集成和清晰、直接的购买流程可以决定整体体验的成败。 Salesforce云以及其他应用程序在过去几年中经历了巨大增长。随着越来越多的功能被捆绑在一起&#xff0c;Un…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…