数据结构-树(c语言实现篇)

article/2025/9/15 16:17:18

数据结构之二叉树(c语言实现篇)

介绍树的概念和二叉树的概念和应用,内容主要是以二叉树为主。

1. 树

1.1 树的概念

树是n个结点的有限集,当n=0时,称为空树。树是一种非线性的数据结构,与前面的线性表、栈和队列是不同的。树的根节点没有前驱,除了根节点外的所有结点有且只有一个前驱。树中所有结点可以有零个或多个后继

在这里插入图片描述

1.2 树的相关概念

在这里插入图片描述

结点的度:一个结点有多少颗子树,子树的个数就是该结点的度,例如B结点有两颗子树,度为2。

叶子结点或终端结点:度为0的结点称为叶子结点也叫作终端结点。例如H和J都是叶子结点。

非终端结点和分支结点:度不为0的结点就叫作分支结点或者非终端结点。例如D和C都是分支结点。

双亲结点或父节点:若一个结点有子结点,也就是该结点不是叶子结点,那么它是它子节点的父节点。例如D是H和J的父节点。

孩子结点或者子结点:一个结点含有子树的根节点就是该节点的子节点。例如D和E是B的孩子结点。

兄弟结点:具有相同父结点的结点互相称为兄弟结点。例如H和I互为兄弟结点。

树的度:一棵树中,最大结点的度称为树的度,例如该树的度为2。

结点的层次:从跟开始定义起,根为第一层,根的子节点第二层,以此类推。

树的高度或深度:树种节点的最大层次。例如,该树的高度为4。

堂兄弟结点:两个结点的父节点为兄弟结点。例如,E和F为堂兄弟结点。

结点的祖先:从根节点到该节点所经过的分支上的所有结点都是该节点的祖先结点,包括父节点。例如,A是所有结点的祖先结点,

子孙结点:以某结点为根的子树上的任意结点都是该节点的子孙结点,例如所有结点都是A结点的子孙结点。

森林:由m颗(m>0)互不相交的树的集合称为森林。

1.3 树的表示方式

树相对于线性表复杂许多,既可以采用顺序存储结构,又可以采用链式存储结构。这里介绍三种常用的存储结构。

1.3.1 双亲表示法

这种存储结构采用一组连续空间来存储每个结点,同时每个结点增加一个伪指针,指向它的双亲结点在数组中的位置。根节点没有双亲结点,所以伪指针为-1。

在这里插入图片描述

1.3.2 孩子表示法

孩子表示法是将每个结点的孩子结点用单链表形成一个线性结构。

1.3.3 孩子兄弟表示法

孩子兄弟表达式又称为二叉树表示法,用二叉链表作为树的存储结构。每个结点包含三个部分:结点的值,第一个孩子的结点,指向其下一个兄弟结点。

typedef int DataType;
struct node {struct node* _firstChild;struct node* _nextBrother;DataType _data;
};

在这里插入图片描述

1.4 树的现实应用

比如某学院下的不同系的不同教室

在这里插入图片描述

或者是我们的硬盘上的文件,等等。

2.二叉树的概念及结构

2.1 二叉树的定义

二叉树是树形结构中的一种特殊结构,其特点是每个结点最多有两颗子树,且子树有左右之分,并且次序不可颠倒,是一颗有序树。二叉树同样也是n个结点的有限集合,有五种形态基本形态:

在这里插入图片描述

几个特殊的二叉树

(1)满二叉树:一棵树的高度为h,含有2^h-1个结点的二叉树称为满二叉树。树种的每一层都拥有最多结点,也就叶子结点都集中在最下面的一层,并且除了该层外的每个结点都有两个孩子结点。

(2)完全二叉树:高度为h,有n个结点,每个结点与其满二叉树中树的编号一一对应,称为完全二叉树。所以满二叉树又是一种特殊的完全二叉树。

在这里插入图片描述

(3)二叉排序树。左子树上的所有结点的值均小于根节点的值,右子树上所有结点的值均大于根节点的值。左右子树同样是一颗二叉排序树。

(4)平衡二叉树。树上任一结点的左子树和右子树的深度相差不超过1。

2.2 二叉树的性质

  1. 非空二叉树的叶子结点数等于度为2的结点数加1,即n0 = n2 + 1。
  2. 非空二叉树上第k层上最多有2^(k-1)个结点。
  3. 高度为h的二叉树最多有2^h - 1个结点。
  4. 具有n个结点的完全二叉树的高度为log2(n+1)向上取整。
  5. 对于具有n个结点的完全二叉树,如果按照从上到下、从左到右依次对所有结点按顺序开始编号,则有以下关系:
    1. 若i>0,i位置的双亲结点位置为(i-1)/2,i等于0时,为根节点,无双亲结点
    2. 若2i+1<n,左孩子序号为2i+1,2i+1>=n无左孩子
    3. 若2i+2<n,右孩子序号为2i+2,2i+2>=n无右孩子

2.3 二叉树的存储结构

2.3.1 顺序存储结构

二叉树的顺序存储结构是指用一组地址连续的存储单元依次从上而下、自左向右存储完全二叉树上的结点元素,按照编号从0~n,如果当前不存在该节点,用一个特殊的值表示(-1),该二叉树和它对应的完全二叉树的编号要完全一致,所以采用完全二叉树或者满二叉树去使用顺序存储最为合适。

在这里插入图片描述

2.3.2 链式存储结构

由于顺序存储的空间利用率比较低,因此二叉树一般采用链式存储结构,链式存储结构的结点包含三个部分,分别是数据域、左指针域、右指针域。

(1) 二叉链表表示法

在这里插入图片描述

typedef int BTDataType;
// 二叉链表
struct BinaryTreeNode
{struct BinaryTreeNode* _pLeft; // 指向当前结点的左孩子struct BinaryTreeNode* _pRight; // 指向当前结点的右孩子BTDataType _data; // 数据域
};

(2)三叉链表表示法

在这里插入图片描述

typedef int BTDataType;
// 二叉链表
struct BinaryTreeNode
{struct BinaryTreeNode* _pParent; // 指向当前结点的双亲struct BinaryTreeNode* _pLeft; // 指向当前结点的左孩子struct BinaryTreeNode* _pRight; // 指向当前结点的右孩子BTDataType _data; // 数据域
};

对比:二叉链表,通常只需要表示孩子结点,而三叉链表适用于经常需要找到该结点的父亲结点。


http://chatgpt.dhexx.cn/article/WBHmARdO.shtml

相关文章

c语言的数据结构表达式求值

最近学习c语言的数据结构中有关栈的实现。下面是用栈实现表达式求值的一个实例&#xff0c;用的是顺序栈的形式 原理&#xff1a; List item 我们默认一‘#’开始&#xff0c;最后输入’#‘结束 在运算中的每一步中&#xff0c;任意两个相继出现的算符theta1和theta2之间的关…

C语言数据结构篇——栈的顺序存储

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;对于计算机的学习者来说&#xff0c;初期的学习无疑是最迷茫和难以坚持的&#xff0c;中后期主要是经验和能力的提高&#xff0c;我也刚接触计算机1年&#xff0c;也在不断的探索&#xf…

C语言数据结构之查找(顺序查找,折半查找)

C语言数据结构之查找&#xff08;顺序查找&#xff0c;折半查找&#xff09; tips&#xff1a;前些天已经学习了树和图的相关知识&#xff0c;今天来总结下两种常用的查找方式&#xff08;顺序查找&#xff0c;折半查找&#xff09;。 为了演示方便&#xff0c;顺序查找和折半…

【C语言数据结构7】--串的实现

串 一、什么是串 串就是我们常说的字符串&#xff0c;它同样是一个线性表。可能有人认为串就是元素为字符的线性表&#xff0c;但这种说法是不准确的。对于普通的线性表&#xff0c;它们关注的往往是单个元素&#xff0c;每个单独的元素都有独立的含义。比如我们用线性表存储…

C语言数据结构——查找(检索)

一、查找的基本概念 查找:查询某个关键字是否在(数据元素集合&#xff09;表中的过程。也称作检索。 查找表: 由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。 主关键字: 能够惟一区分各个不同数据元素的关键字 次关键字: 通常不能惟一区分各个不同数据元素的…

C语言数据结构——广义表

C语言数据结构中&#xff0c;广义表和数组一样&#xff0c;也是线性表的一种推广&#xff01; 广义表的定义&#xff1a; 广义表 LS 为n&#xff08;n≥0&#xff09;个元素的有穷序列&#xff0c;记作&#xff1a; LS &#xff08;d1, d2, … dn&#xff09; 其中&#xff1…

C语言数据结构——图

一、图的基本概念 图是由顶点集合及顶点间的关系集合组成的一种数据结构。vertex, edge 图G的定义是&#xff1a; G &#xff08;V&#xff0c;E&#xff09; 其中&#xff0c; V {x|x∈某个数据元素集合} E { (x&#xff0c;y)|x&#xff0c;y∈V} &#xff08;无向图&#…

数据结构(c语言版本)

1.基本概念 1.1数据 对客观事物的符号表示&#xff0c;在计算机与科学中是指所有能输入到计算机并被计算机程序处理的符号的总称。 1.2数据元素 是数据的基本单位&#xff0c;在计算机程序中作为一个整体进行考虑和处理 1.3数据对象 是相同性质数据元素的集合&#xff0c…

c语言数据结构

目录 一、数据结构构造概述 1.1、什么是数据结构 1.2、数据的逻辑结构的4种分类 二、线性表 2.1、线性表概述 2.2、顺序表 2.3、链表 2.3.1、链表节点的创建 2.3.2、链表结点遍历 2.3.3、链表结点删除 2.3.4、链表的插入 ​ 三、栈和队列 3.1、栈概述 3.2、栈…

C语言数据结构知识点小结(全)

Catologue C语言数据结构一、基本概念和术语二、时间、空间复杂度&#xff08;1&#xff09;时间复杂度&#xff08;2&#xff09;空间复杂度 三、类C语言有关操作补充1&#xff1a;数组定义补充2&#xff1a;动态内存分配补充3&#xff1a;C中的参数传递 四、线性表&#xff0…

七丶青龙nvjdc部署教程+短信验证登录对接傻妞

青龙nvjdc部署教程短信验证登录对接傻妞Nolanjdc 没有服务器的先自行购买&#xff0c;这里推荐腾讯云2H4G8M首年70–点击购买 青龙面板安装教程 傻妞机器人安装教程 XDD安装教程 QQ交流&#xff1a;1014549449 --------------点击跳转 注丶只能对接一个&#xff0c;要么对接…

手机短信验证

在项目中经常会用到手机短信验证注册&#xff0c;登录等功能&#xff0c;所以我想写一篇文章来给大家提供一个参考。 阿里大于-个人感觉比较好用的短信验证平台&#xff0c;下面是接入阿里大于sdk的步骤。 阿里大于官网&#xff1a;直通车, 进入官网需要注册&#xff0c;注册…

014_关于session实现短信验证登录的前端启动

014_关于session实现短信验证登录的前端启动 1、进入到nginx相对应的文件夹&#xff0c;shfit右键&#xff0c;进入PowerShell并且执行nginx 2、启动我们的nginx,嘿嘿&#xff0c;可以访问我们的前端网页啦&#xff01;&#xff01;&#xff01;它就是模仿我们的大众点评来着…

基于Redis的短信验证登录

基于Redis的短信验证登录 1、用户调用发送短信验证码接口2、用户调用登录/注册接口3、用户调用校验接口4、SpringMvc拦截器注册5、token刷新拦截器6、登录拦截器 1、用户调用发送短信验证码接口 用户调用sendCode()接口&#xff0c;把phone传到后端&#xff0c;后端对phone进行…

使用聚合数据短信API测试(短信验证登录)

搞一手聚合数据短信API测试&#xff08;之前用阿里云的搞过&#xff0c;今天我们用聚合&#xff09; 注册聚合账号&#xff01;聚合官网链接登陆后进入短信服务API&#xff08;免费提供十次&#xff09; 添加自定义模板&#xff08;审核速度看脸&#xff09; 审核成功后得…

android studio 实现短信验证 登录

登录 http://www.mob.com/ 注册 创建项目 加入依赖 贴代码 classpath “com.mob.sdk:MobSDK:2018.0319.1724” apply plugin: ‘com.mob.sdk’ // 在MobSDK的扩展中注册SMSSDK的相关信息 这里使用自己的 appKey appSecret MobSDK {appKey “2e2974aec0” appSecret “1d35b87…

Java简单实现短信验证登录(Session、Redis)

前端设计 <div class"login-form"><div style"display: flex; justify-content: space-between"><el-input style"width: 60%" placeholder"请输入手机号" v-model"form.phone" ></el-input><e…

Vue与Node.js实现手机短信验证登录

手机短信使用的第三方平台是联容云&#xff0c;注册就送8块钱体验费&#xff0c;足够自己用用了&#xff0c;注册完自己建一个应用就能拿到需要使用的配置了&#xff0c;如图 注册完之后1就可以使用了。 Node.js后端使用了Express框架 "js-base64": "^3.7.2&qu…

【青龙面板+诺兰2.0 网页短信验证登录+bot查询】

看这个之前&#xff0c;如果是没搭建过的先看下面这篇哈&#xff0c;如果是跟着下面的搭建完了&#xff0c;出现了机器人5次获取验证码失败&#xff0c;让你用Cookie方式登录的情况&#xff0c;看这篇哈。 前提&#xff1a;自己有服务器&#xff01;这里用的Centos7.6做演示&am…

Springboot实现短信登录验证

Springboot学习笔记——Java实现短信登录验证功能--Servlet/SSM/SpringBoot都可以用 小白记录一下短信验证登入的实现&#xff0c;方便以后可以拿来直接用。 发短信平台&#xff1a;互亿无线 官网地址 登入注册啥的就不说了&#xff0c;新人注册会送十条短信验证&#xff0c;想…