数据结构基础讲解(八)——树和二叉树专项练习(上)

本文数据结构讲解参考书目:

通过网盘分享的文件:数据结构  C语言版.pdf
链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwd=ze8e 提取码: ze8e

数据结构基础讲解(七)——数组和广义表专项练习-CSDN博客

个人主页:樱娆π-CSDN博客


目录

树的定义

树的基本术语

树的基本操作

二叉树

二叉树的定义

二叉树的基本操作

二叉树的性质

理解满二叉树,完全二叉树,非完全二叉树

二叉树的存储结构

1.顺序存储

2.链式存储


 

由于这节内容较多,我将分两节来讲解

树的定义

树(Tree)是n(n>=0)个结点的有限集,它或为空树(n= 0); 或为非空树,对千非空树T

(1)有且仅有一个称之为根的结点;

(2)除根结点以外的其余结点可分为 m(m>0)个互不相交的有限集 Ti , T2 , …,几,其中每 一个集合本身又是一棵树,并且称为根的子树(SubTree)。

树的结构定义是一个递归的定义,即在树的定义中又用到树的定义,它道出了树的固有特性

树的基本术语

(1) 结点:树中的一个独立单元。包含一个数据元素及若于指向其子树的分支.

(2)结点的度:结点拥有的子树数称为结点的度。

(3)树的度:树的度是树内各结点度的最大值。

(4) 叶子: 度为 0 的结点称为叶子或终端结点。

(5) 非终端结点:度不为 0 的结点称为非终端结点或分支结点。除根结点之外,非终端结点 也称为内部结点。

(6)双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。

(7) 兄弟:同一个双亲的孩子之间互称兄弟。

(8) 祖先:从根到该结点所经分支上的所有结点。

(9) 子孙:以某结点为根的子树中的任一结点都称为该结点的子孙。

(10) 层次:结点的层次从根开始定义起,根为 第一层,根的孩子为第二层。树中任一结点的 层次等千其双亲结点的层次加 1。

(11)堂兄弟:双亲在同 一层的结点互为堂兄弟

(12)树的深度:树中结点的最大层次称为树的深度或高度。

(13)有序树和无序树:如果将树中结点的各子树看成从左至右是有次序的(即不能互换), 则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的 称为最后一个孩子

(14)森林:是 m (m>0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即 为森林。由此,也可以用森林和树相互递归的定义来描述树

树的基本操作

基本操作初始条件操作结果
InitTree(&T)/构造空树T
DestroyTree (&T)树T存在销毁树T
CreateTree(&T,definition)definition 给出树 T 的定义按 definition 构造树 T
ClearTree(&T)树T存在将树T清为空树
TreeEmpty(T)树T存在若 T 为空树,则返回 true, 否则 false
TreeDepth(T)树T存在返回T的深度
Root(T)树T存在返回T的根
Value(T,cur_e)树 T 存在, cur_e是 T 中某个结点返回 cur_e 的值
Assign(T,cur_e,value)树 T 存在, cur_e是 T 中某个结点结点 cur_e 赋值为 value
Parent(T,cur_e);树 T 存在, cur_e是 T 中某个结点若 cur_e是 T 的非根结点,则返回它的双亲,否则函数值为 “空 ”
LeftChild(T,cur_e)树 T 存在, cur_e是 T 中某个结点若 cur_e是T 的非叶子结点,则返回它的最左孩子,否则返回 “空 ”
RightSibling(T,cur_e)树 T 存在, cur_e是 T 中某个结点若 cur_e 有右兄弟,则返回它的右兄弟,否则函数值为 “空 ”
InsertChild(&T,p,i,c)树 T 存在, p 指向 T 中某个结点, 1<=i<=p 所指结点的度+ 1, 非空树 c 与 T 不相交插入c为T中 p 指结点的第1棵子树
DeleteChild(&T,p,i)树 T 存在, p 指向 T 中某个结点, 1<=i<=p 指结点的度删除T中 p 所指结点的第1棵子树
TraverseTree(T)树T存在按某种次序对T的每个结点访问一次

二叉树

二叉树的定义

二叉树(Binary Tree)是n(n>0)个结点所构成的集合,它或为空树(n= 0); 或为非空树, 对于非空树T

(1) 有且仅有一个称之为根的结点;

(2)除根结点以外的其余结点分为两个互不相交的子集T1和T2, 分别称为T的左子树和右子 树,且兀和乃本身又都是二叉树。 二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点:

  1. 二叉树每个结点至多只有两棵子树(即二叉树中不存在度大于2 的结点);
  2. 二叉树的子树有左右之分,其次序不能任意颠倒。 二叉树的递归定义表明二叉树或为空,或是由一个根结点加上两棵分别称为左子树和右子树 的、互不相交的二叉树组成。由千这两棵子树也是二叉树,则由二叉树的定义,它们也可以是空 树

二叉树的基本操作

基本操作初始条件操作结果
InitBiTree(&T)构造空二叉树T
DestroyBiTree(&T)二叉树T存在销毁二叉树T
CreateBiTree(&T,definition)二叉树T存在按 definition 构造二叉树 T
ClearBiTree(&T)二叉树T存在将二叉树T清为空树
BiTreeEmpty(T)二叉树T存在若 T 为空二叉树,则返回 true, 否则 false
BiTreeDepth (T)二叉树T存在返回T的深度
Root(T)二叉树T存在返回T的根
Value(T,e)二叉树 T存在,e是 T中某个结点返回e的值
Assign(T,&e,value)二叉树 T存在,e是 T中某个结点结点 e 赋值为 value
Parent(T,e)二叉树 T存在,e是 T中某个结点若 e是T的非根结点,则返回它的双亲,否则返回 “空 ”
LeftChild(T,e)二叉树 T存在,e是 T中某个结点返回e的左孩子。若e 无左孩子,则返回 “空 ”
RightChild(T,e)二叉树 T存在,e是 T中某个结点返回 e的右孩子。若 e 无右孩子,则返回 “空 ”
LeftSibling (T, e)二叉树 T存在,e是 T中某个结点返回 e的左兄弟。若 e是T的左孩子或无左兄弟,则返回 “空 ”
RightSibling(T,e)二叉树 T存在,e是 T中某个结点返回 e的右兄弟。若 e是T的右孩子或无右兄弟,则返回 “空 ”
InsertChild(&T,p,LR,c)二叉树 T存在, p 指向 T中某个结点,LR 为 0 或 1, 非空二叉树 c 与 T 不相交且右子树为空根据 LR 为 0 或 1, 插入 c 为 T中p 所指结点的左或右子树。p 所指结点的原有左或右子树则成 为 c的右子树。
DeleteChild (&T, p, LR)二叉树T存在,p指向T中某个结点,LR为0或1根据LR为0或1, 删除T中p所指结点的左或右子树
PreOrderTraverse(T}二叉树T存在先序遍历T, 对每个结点访问一次
InOrderTraverse(T)二叉树T存在中序遍历T, 对每个结点访问一次
PostOrderTraverse(T}二叉树T存在后序遍历T, 对每个结点访问一次
LevelOrderTraverse(T)二叉树T存在层序遍历T, 对每个结点访问一次

二叉树的性质

性质1 : 在二叉树的 第i层上至多有2的(i-1)次方个结点(i>=1)

性质2 :深度为K的 二叉树至多有2的k次方 -1 个结点 (k>=1)

性质3 :对任何一棵二叉树T, 如果其终端结点数为n。度为2的结点数为n2,则n0 = n2+1

理解满二叉树,完全二叉树,非完全二叉树

 满二叉树

定义:  所有节点都有两个子节点,除了最后一层节点。最后一层节点要么全都有两个子节点,要么全都没有子节点。
特点:  高度为 h 的满二叉树有 2^h - 1 个节点。
例子:  高度为 3 的满二叉树,有 7 个节点。

完全二叉树

定义:  除了最后一层节点外,其他层节点都具有两个子节点。最后一层节点可以从左到右依次排列,但不必是满的。
特点:  高度为 h 的完全二叉树,节点数量介于 2^(h-1) 和 2^h - 1 之间。
例子:  高度为 3 的完全二叉树,可以有 7 个节点,也可以有 6 个节点。

 非完全二叉树

定义:  既不是满二叉树,也不是完全二叉树。
特点: 节点的排列没有规律,可能存在节点只有一个子节点,或者最后一层节点没有按顺序排列。

 

二叉树的存储结构

1.顺序存储

顺序存储结构使用一组地址连续的存储单元来存储数据元素,为了能够在存储结构中反 映出结点之间的逻辑关系,必须将二叉树中的结点依照一定的规律安排在这组单元中。

对于完全二叉树,只要从根起按层序存储即可,依次自上而下、自左至右存储结点元素,即 将完全二叉树上编号为i 的结点元素存储在如 上定义的一维数组中下标为i-1的分量中。

对于一般二叉树,则应将其每个结点与完全二叉树上的结点 相对照,存储在一维数组的相应分量 中。

//-----二叉树的顺序存储表示-----
#define MAXTSIZE 100 
typedef TElemType SqBiTree [MAXTSIZE];
SqBi Tree bt;
2.链式存储

二叉树的结点由一个数据元素和分别指向其左、 右子树的两个分支构成,则表示二叉树的链表 中的结点至少包含 3 个域:数据域和左、 右指针域。

利用这两 种结点结构所得二叉树的存储结构分别称之为二叉链表和三叉链表。

//- - - - -二叉树的二叉链表存储表示- ----
typedef struct BiTNode{ 
ll
,
TElemType data; 
struct BiTNode *lchild,*rchild; 
) BiTNode,*BiTree;

————由于博主还是大三的在读生,时间有限,每天会不定时更新一些学习经验和一些32的项目,如果喜欢就点点关注吧,大佬们!!!!———— 

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

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

相关文章

IDEA 常用配置和开发插件

件市场中搜索并安装“Git Integration”插件。 一、前言 在本篇文章中我会为大家总结一些我自己常用的配置和开发插件&#xff0c;此外也给大家提供一个建议&#xff0c;可以根据自己的项目需求和个人偏好选择适合的插件。另外&#xff0c;IDEA 也在不断更新&#xff0c;可能会…

C++进阶 二叉搜索树的讲解

二叉搜索树的概念 二叉搜索树又称为二叉排序树。 二叉搜索树的性质 若它的左子树不为空&#xff0c;则左子树上所有结点的值都小于等于根结点的值若它的右子树不为空&#xff0c;则右子树上所有结点的值都大于等于根结点的值它的左右子树也分别为二叉搜索树二叉搜索树中可以支持…

Geneformer AI 模型,有限数据也能解锁基因网络

目录 类似于 BERT 的单单元数据参考模型 NVIDIA Clara 工具组合用于药物研发 用于疾病建模的基础 AI 模型 Geneformer 是最近推出的 和功能强大的 AI 模型&#xff0c;可以通过从大量单细胞转录组数据中进行迁移学习来学习基因网络动力学和相互作用。借助此工具&#xff0c;…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录&#xff1a; &#xff08;1&#xff09;拆单接口 &#xff08;2&#xff09;取消订单业务补充关闭支付记录 &#xff08;3&#xff09;支付宝关闭交易 &#xff08;4&#xff09;查询支付交易记录 &#xff08;5&#xff09;PaymentFeignClient 远程接口 &#xff08…

探索Python轻量级数据库:TinyDB的奇妙之旅

文章目录 探索Python轻量级数据库&#xff1a;TinyDB的奇妙之旅背景&#xff1a;为何选择TinyDB&#xff1f;什么是TinyDB&#xff1f;如何安装TinyDB&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python轻量级数据库&#xff1a;TinyDB的奇妙之旅 背景&…

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…

Vue介绍、窗体内操作、窗体间操作学习

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

【Linux】Ubuntu 22.04 shell实现MySQL5.7 tar 一键安装

参考 https://blog.csdn.net/qq_35995514/article/details/134350572?spm1001.2014.3001.5501 源文章是centos 的 教程&#xff0c;这里为了大家的方便&#xff0c;再原作者基础上做了修改&#xff0c;记录了ubuntu的22.04的我的配置&#xff0c;加了一个删除原有mysql 的脚本…

【诉讼流程-健身房-违约认定-私教课-诉讼书前提材料整理-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(2)】

【诉讼流程-健身房-违约-私教课-前期法律流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解&#xff08;2&#xff09;】 &#xff08;1&#xff09;前言说明1、目的2、一个小测试1、更换原教练2、频繁更换教练3、上课估计拖课&#xff0c;占用上课时间&#xff0c;抽烟等。4、以…

Python计算机视觉 第10章-OpenCV

Python计算机视觉 第10章-OpenCV OpenCV 是一个C 库&#xff0c;用于&#xff08;实时&#xff09;处理计算视觉问题。实时处理计算机视觉的 C 库&#xff0c;最初由英特尔公司开发&#xff0c;现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发布的开源库&#xff0c;这意味…

2024/9/11学校教的响应式前端能学到什么?

9.11 1&#xff09;砌砖 确定整体框架&#xff0c;而不是想到一点写一点&#xff0c;类似盖大楼&#xff0c;不是想到哪盖到哪&#xff0c;先砌砖&#xff0c;再装修 砌砖前先划分好砌砖范围(初始化样式) 清除body自带的内外边距 * { margin: 0; padding: 0; }去掉li的小圆点…

【新片场-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹&#xff0c;显示数据 # 3 可以显示如下&#xff0c;不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值&#xff0c;js中…

快速生成服务器响应json-server的安装和使用

json-server介绍地址:https://www.geeksforgeeks.org/json-server-setup-and-introduction/ 1.json-server是什么? 基于自定义的json文件,快速生成服务端响应,可用于前端调试接口 2.安装和卸载json-server 2.1 安装: 使用npm命令: npm install -g json-server 2.2 卸载 npm …

工厂方法模式和抽象工厂模式

工厂方法模式 一个工厂只能创建一种产品 工厂方法模式的结构 工厂方法模式包含以下4个角色 Product&#xff08;抽象产品&#xff09; ConcreteProduct&#xff08;具体产品&#xff09; Factory&#xff08;抽象工厂&#xff09; ConcreteFactory&#xff08;具体工厂…

(论文解读)Visual-Language Prompt Tuning with Knowledge-guided Context Optimization

Comment: accepted by CVPR2023 基于知识引导上下文优化的视觉语言提示学习 摘要 提示调优是利用任务相关的可学习标记将预训练的视觉语言模型&#xff08;VLM&#xff09;适应下游任务的有效方法。基于CoOp的代表性的工作将可学习的文本token与类别token相结合&#xff0c;…

项目需求 | MySQL增量备份与恢复的完整操作指南

目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1&#xff1a;启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2&#xff1a;执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…

WSL安装Redis

前言 本来一直是在虚拟机的Ubuntu开发 但是 搞着搞着内存不足 导致我某些数据损坏了 然后目前迁移到Wsl开发 运行WSL的相较于虚拟机你不需要很多的性能开销&#xff01; 我只是代码开发和git交互&#xff0c;如果是搞逆向还是虚拟机。 记录一下redis 安装卸载 免得以后又忘了…

java基于PDF底层内容流的解析对文本内容进行编辑

本文实现了基于坐标位置对PDF内容的底层修改而非覆盖&#xff0c;因此不会出现在某些高级PDF编辑器中可以移除插入内容或者文件随着编辑次数增多而大幅增大&#xff08;原因是原内容还在文件中&#xff09;的问题&#xff0c;而且使用的pdfbox是一个开源的、免费的PDF处理库&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…