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

news2024/9/27 19:24:39

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

通过网盘分享的文件:数据结构  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.coloradmin.cn/o/2137634.html

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

相关文章

【初阶数据结构】详解树和二叉树(一) - 预备知识(我真的很想进步)

文章目录 前言1. 树1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用 2. 二叉树2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树概念和性质的一些习题 前言 初阶数据结构篇马上要迎来了一个新的成员&#xff0c;那就是"二叉…

这才是导师认可的论文 / 开题技术路线图

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 1. 技术路线图的常见框架结构 技术路线图根据研究内容和实验设计的不同&#xff0c;可以采用多种结构。以下是三种常见的技术路线图框架&#xff1a; 1.1 顺序式框架 适用领…

第十一周:机器学习笔记

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

微软发布Windows Agent Arena 为生成式AI代理提供基准测试

使用生成式人工智能和大型语言模型来自动化和简化使用 PC 的人员的任务的情况持续增长。不过&#xff0c;人们也需要了解人工智能在完成任务方面的工作表现。本周微软研究院宣布&#xff0c;它已开发出一种专门用于在 Windows PC 上测试人工智能代理的基准。 微软在 GitHub 页面…

CHARLS数据库系列教程(2)---数据清洗、拼接和整理(1)

写在前面的话&#xff0c;本节内容实在太多了&#xff0c;只能做了一个小合集&#xff0c;分成2章来介绍。 CHARLS 是一项具备中国大陆 45 岁及以上人群代表性的追踪调查&#xff0c;旨在建设一个高质量的公共微观数据库&#xff0c;采集的信息涵盖社会经济状况和健康状况等多维…

Leetcode Hot 100刷题记录 -Day16(旋转图像)

旋转图像 问题描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6]…

JavaScript - 异步编程

1. 前言 在 JavaScript 中&#xff0c;异步编程是一种处理需要等待操作&#xff08;如网络请求、文件读取或计时器&#xff09;的编程方式。由于 JavaScript 是单线程的&#xff0c;意味着它一次只能执行一个任务。异步编程允许你在等待某些操作完成时&#xff0c;继续执行其他…

河海大学《2020年+2021年827自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届河海大学827自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2020年复试真题 2021年初试真题 Part1&#xff1a;完整版真题 2020年复试真题 2021年…

Cortex-A7:__disable_irq和GIC_DisableIRQ、__enable_irq和GIC_EnableIRQ的区别(1)API介绍

0 相关资料 ARM Generic Interrupt Controller Architecture version 2.0.pdf 1 API介绍 1.1 __disable_irq __disable_irq函数的作用是失能IRQ&#xff0c;也就是不响应中断。实现代码如下&#xff1a; /**\brief Disable IRQ Interrupts\details Disables IRQ interrupt…

Pikachu靶场之XSS

先来点鸡汤&#xff0c;少就是多&#xff0c;慢就是快。 环境搭建 攻击机kali 192.168.146.140 靶机win7 192.168.146.161 下载zip&#xff0c;pikachu - GitCode 把下载好的pikachu-master&#xff0c;拖进win7&#xff0c;用phpstudy打开网站根目录&#xff0c;.....再用…

Python基础知识学习(2)

一&#xff0c;分支条件判断语句 在python中&#xff0c;分支条件语句如下&#xff1a; 1&#xff0c;判断条件&#xff1a;if exception: 2&#xff0c;接着判断的语句为&#xff1a;elif exception: 3&#xff0c;最后的条件为&#xff1a;else: 4&#xff0c;通过缩进来表示…

建一栋房子会用到哪些资质?

在建筑工程领域&#xff0c;资质是衡量建筑企业实力和能力的重要标准。修建一栋房子&#xff0c;从设计到施工&#xff0c;再到最终的验收和维护&#xff0c;涉及到众多环节和专业领域。每个环节都需要相应的资质作为保障&#xff0c;以确保工程的质量和安全。那么&#xff0c;…

Jsp学习笔记(详解)

千锋教育Java视频 从入门到精通 JSP 4h 一&#xff0c;引言 1.1 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注解代码修改麻烦&#xff1a;…

移除元素(反向双指针)

题目&#xff1a; 算法分析&#xff1a; 优化关键&#xff1a;题目不需要关注除前k元素以外的部分左指针等于对应值&#xff0c;复制右指针替代&#xff0c;右指针增加&#xff08;左指针不变可以继续判断复制的右指针元素是否符合条件&#xff09;否则左指针增加 算法图解&a…

华为项目管理培训产品总监兼首席架构师刘钊受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 华为项目管理培训产品总监兼首席架构师刘钊先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“打造项目管理人才队伍——华为项目经理任职资格和专业认证体系”。大会将于10月…

unity3d入门教程五

unity3d入门教程五 13鼠标事件处理13.2鼠标跟随13.3鼠标拖拽&#xff08;选中对象&#xff0c;拖动对象&#xff09;13.4几个问题14.1事件函数14.2脚本的执行顺序14.3脚本的参数14.4引用类型的参数&#xff08;进行图片更换&#xff0c;人物换装&#xff09; 13鼠标事件处理 需…

PointNet++改进策略 :模块改进 | PointCAT, 使用交叉注意力机制来提升3D点云任务中提升模型精度

论文题目&#xff1a;PointCAT:Cross-Attention Transformer for Point Cloud通讯地址&#xff1a;南京理工大学代码地址&#xff1a;https://github.com/xincheng-yang/PointCAT . PointCAT架构&#xff1a;PointCAT提出了一种基于交叉注意力机制的Transformer网络&#xff0c…

【Python机器学习】序列到序列建模——使用序列到序列网络构建一个聊天机器人

为了寻聊天机器人&#xff0c;下面使用康奈尔电影对话语料库训练一个序列到序列的网络来“适当的”湖大问题或语句。以下聊天机器人示例采用的是Keras blog中的序列到序列的示例。 为训练准备语料库 首先&#xff0c;需要加载语料库并从中生成训练集&#xff0c;训练数据将决…

项目升级必备!TS装饰:简化代码、增加功能的利器 | TypeScript入门指南07

嘿&#xff0c;朋友&#xff01;听说过TS里的装饰器没&#xff1f;就像给代码加了个‘魔法贴’&#xff0c;轻轻一点&#xff0c;功能升级&#xff0c;结构清晰。这篇文章&#xff0c;咱们聊聊这背后的魔法是怎么一回事&#xff01; ts 入门指南系列 Ts vs Js 谁适合前端开发&a…

用Inno Setup打包QT程序输出安装包

InnoSetup打包编译好的QT程序 文章目录 InnoSetup打包编译好的QT程序介绍具体步骤自定义脚本更改引入配置文件/动态库路径申请管理员权限设置安装过程界面的图标和图片C程序依赖运行库 介绍 Inno Setup&#xff1a;用于打包安装程序 具体步骤 首先打开inno setup compiler 第…