【树】对树的初步认识:树的表示法与存储结构

树与二叉树:核心概念与存储结构详解 摘要:本文系统介绍了树与二叉树的基本概念、存储结构及应用。重点阐述了树的定义及其与二叉树的区别,详细讲解了二叉树的性质、顺序与链式存储结构实现。深入剖析了二叉树的遍历算法(递归/非递归)及线索二叉树原理。分析了树的三种存储方式(双亲/孩子/孩子兄弟表示法)及其适用场景,详解了森林与二叉树的转换规则。最后,重点介绍了哈夫曼树的构造算法及其在数据压缩中的典型应用——哈夫曼编码,包括编码生成、解码过程和完整代码实现。全文通过概念讲解、示例演示和代码实现相结合的方式,全面覆盖了树形数据结构的关键知识点。 阅读详情

本文概述:

  1. 本文主要介绍了树这种数据结构做了基本介绍,只涉及了树的基本名词和存储方式;
  2. 重点是树的存储方式,其本质还是链式和顺序存储结构而已;
  3. 图片、代码结合,旨在理解树的真正存储的思想。

树的基本名词

 

  • 树的定义(特征):
  1. 每个节点都只有有限个子节点或无子节点;
  2. 没有父节点的节点称为根节点;
  3. 每一个非根节点有且只有一个父节点;
  4. 除了根节点外,每个子节点可以分为多个不相交的子树;
  5. 树里面没有环路(cycle)

 

  • 结点的度:结点拥有的子女的个数。
  • 叶子(leaf):没有儿子的结点。
  • 分支结点:有儿子的结点。
  • 树的度:树中的某个结点有最大的子女个数。

 

  • 层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。
  • 树的高度(height):为该节点到一片树叶的最长路径的长;
  • 某节点的深度(depth):为从根到该节点的唯一路径长;

 

  • 无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置。
  • 有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置。
  • 森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。

 

  • 这个路径的长(length)为该路径上的边的条数;
  • 具有相同父亲的节点互称为兄弟(sibling);

 


树的表示法

树通常有四种表示法:树形表示法、嵌套集合表示法、凹入表表示法、广义表表示法;

而我们常用的是树型表示法。

注:本图来自《大话数据结构》,下文中也有部分图来自该书。


树的存储结构

  • 对于上文中的树型表示法,我们得像个办法把它保存下来(放在内存或磁盘中)。然而如何将它的那种树形的结构保存下来,在下次读取时能够恢复成这种结构呢?这,就是存储结构。
  • 存储结构研究的就是:如何将树的这种逻辑物,更好地存储在线性的内存空间中,依然使得其拥有它原来的树形结构。
  • 就像在线性表中,对于一个有限序列(1,2,3,……),我们把它放在了顺序表(即数组)和链表中一样,树的存储结构也有这类似的两种保存方式。

 

双亲存储法

  • 本质:用一个结构体数组保存当前的具体数据和双亲的位置;

 


#define MAXSIZE 10 //树的节点个数;

typedef struct node
{
	char data; //该节点的具体值;
	int parent; //该节点的父节点的数组下标值;
}node;
typedef struct tree
{
	node TreeArray[MAXSIZE]; //存放各个节点的数组;
	int NodeNumber,root;//NodeNumber表示本树的所有节点的个数;root表示根节点的位置(一般为-1);
}tree;

//tree.TreeArray[0]=A,-1

 

数组方式孩子存储法


#define N 3 //表示每个节点所拥有得最大子女数是3个;即一个节点,只允许有最多3个小孩;
#define MAXSIZE 10  //表示本树的能存储最多10个节点;

typedef struct node
{
	char data;
	int child[N]; //child保存的是此data节点下的孩子的下标;
}node; //node是本结构体的新别名; 

node tree[MAXSIZE]; //存储树的节点;
int root; //根节点的下标;
int NodeNumber; //树的所有节点的个数;

 

指针方式孩子存储法

因为每个节点所含子女数不同,因此child数组的大小是由N来决定的;由此造成了很多空间浪费;而树的链表方式孩子存储法解决了这个问题;


#define N 3 //表示每个节点所拥有得最大子女数是3个;即一个节点,只允许有最多3个小孩;
typedef struct node
{
	char data;
	struct node *child[N];
}node, *tree; //node是本结构体的新别名;tree是结构体指针;
tree root; //结构体指针tree指向root;

 

链表方式孩子存储法

#define MAXSIZE 10

typedef struct ChildNode //存储一个节点的在数组中的位置和下一个节点的地址;
{
	int child;
	struct ChildNode *NextChild;
}ChildNode, *ChildNodePoint;

typedef struct node
{
	char data;
	ChildNodePoint FirstChild;
}node;

typedef struct tree
{
	node TreeAyyary[MAXSIZE];
	int NodeNumber, root; //NodeNumber表示本个树总共含多少个节点,root表示根节点的位置;
}tree;

 

孩子兄弟存储法

typedef struct node
{
	char data;
	struct node *FirstChild, *RightChild; //分别指向该节点的第一个子女和其右兄弟;
}node, *NodePoint;
NodePoint root; //声明结构体指针变量,同时也让节点指针指向root;

 

 

树与二叉树的存储结构详解:从理论到C++代码实现 树和二叉树是重要的非线性数据结构,用于表示层次关系。树的基本概念包括结点、度、层次等,常用存储方法有双亲表示法、孩子表示法和孩子兄弟表示法。二叉树是每个结点最多有两个子树的树结构,分为顺序存储和链式存储两种方式。顺序存储适合完全二叉树,链式存储更灵活但查找双亲较难。树与二叉树可相互转换,不同存储结构各有优缺点,适用于不同场景。理解这些存储结构有助于高效处理树形数据。 阅读详情

相关推荐

树的定义及表示

在前面的一些文章中,我们介绍了一些线性数据结构,然而在实际应用中,仅有线性数据结构是不够的,如公司员工上下级关系,家族图谱,省市关系这些具有层级关系的很难用线性数据结构来表示,所以还要引入非线性数据结构,今天就带大家介绍一种非线性数据结构—树。 1.树的相关定义 树是由n(n ≥ 0)个结点组成的一个具有层次关系的集合,如图1所示: 如果n=0,该树为一棵空树 如果n>0,该树为一棵非空树,图1就是一棵非空树 下面介绍一些树中的术语: 结点:树中的每个元素成为结点 根结点:在任意一棵树中,有且仅有一

qq_46213710的博客 5904

图解树的3种表示方法(含完整C代码)

树的三种表示方式、孩子表示法、双亲表示法、孩子兄弟表示法,详细图解,完整C语音代码实现

weixin_54186646的博客 5389

瑞芯微RK3576开发板实战:6TOPS NPU如何加速你的AIoT项目(附性能测试)

本文以瑞芯微RK3576开发板为核心,深入探讨其6TOPS NPU在AIoT项目中的实战应用。通过详细的性能测试对比,展示了NPU如何将AI模型推理速度提升15倍以上,并大幅降低CPU负载。文章涵盖从环境搭建、模型转换优化到多屏异显与系统级调优的全流程,为开发者提供了将硬件算力转化为实际项目加速效果的完整指南。

oauth7security的博客 820

数据结构之广义表表示二叉树以及广义表建立二叉树

数据结构之广义表表示二叉树以及广义表建立二叉树

小杰312的博客 9213

Anomalib实战:5分钟搞定图像异常检测模型训练(附完整代码)

本文提供了一份基于Anomalib框架的图像异常检测快速实战指南。文章详细介绍了从环境搭建、数据准备到模型训练与推理的完整流程,重点推荐了训练速度快、效果稳定的PatchCore模型,并附带了可运行的完整代码,旨在帮助开发者快速上手工业质检等实际应用。

weixin_29039773的博客 420

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)

一、树的双亲表示 存储结构 采用结构体数组的形式存储数据。 (根结点parent=1:它没有双亲结点了) //树的双亲表示 typedef struct { char data; //结点数据 int parent; //双亲在数组中的位置 }Tree; Tree tree[MAXSIZE]; 总代码 //树的双亲表示法(双亲树) //getchar():吸收换行符 #include<stdio.h> #define MAXSIZE 20 int cou...

great_yzl的博客 1789

CAB单片机开发指南

CAB单片机开发使用指南,IDE安装及烧录注意事项

Zoebuxiangtian的博客 1558

数据结构学习笔记——树、二叉树和森林

(一)树的概念 (二)结点 叶子结点、孩子结点、双亲结点、兄弟结点: 1、也称为终端结点,它是没有子结点的结点(度为0),例如上图中,D、E、F、G都是叶子结点; 2、一个结点的后继结点称为该结点的,例如上图中,A的孩子结点是B、C; 3、一个结点称为其后继结点的,例如上图中,B、C的双亲结点是A,D、E的双亲结点是B; 4、在同一双亲结点下的孩子结点互为,例如上图中,B、C互为兄弟结点,它们有共同的双亲A,另外D、E互为兄弟结点,它们有共同的双亲B。(三)树的性质 1、树中结点的子结点(孩子)个数称为该,

小宇y的博客 5343

2025 年国人友好神刊盘点:20 本审稿快、分区高的 SCI 期刊,速抢发文先机!

科睿唯安最新发布的 2024 年影响因子(2025 年公布)显示,多本 TOP 期刊影响因子迎来大幅上涨!尤其是对国人友好的期刊,因审稿效率高、版面费亲民、国人发文占比超 40%,成为科研人员投稿热门。本文精选 20 本潜力神刊,涵盖Cell 子刊、顶流期刊、黑马期刊、性价比之王及新晋分区 TOP,附完整的影响因子、中科院分区、审稿周期、收稿方向攻略,助你抢占发文先机!

good_rrrrr的博客 5559

超实用!用 Ollama + DeepSeek + Dify 搭建本地知识库,提升企业效率

本文介绍了如何使用 Ollama + DeepSeek + Dify 搭建本地知识库,帮助企业高效管理信息。通过简单配置,可实现智能问答、文档检索等功能,提升效率并保障数据安全。

Happiness is everywhere 4294

树的三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法

抽象数据类型: 树的存储结构: 利用顺序存储和链式存储的特点,完全可以实现对树的存储结构的表示。介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。 1.双亲表示法 我们假设以一段连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。也就是说,每个结点除了直到自己是谁外,还要直到自己的双亲在哪里。如图: 其中data就是数据域,存储结点的信息。而paren...

Huberyxiao的博客 3万+

渗透测试之哥斯拉实战

可以直接在这里使用meterpreter命令进行对服务端的控制。选择目标 - 添加,配置连接信息,之后测试连接成功!php的shell功能如图。先要进行数据库的配置信息。可以直接在这里打包全站。

大河之犬的博客 2488

数据结构 - 树的两种生成方式:双亲表示法和孩子表示法

上个星期,周老师跳过队列讲了树= = 所以我们先写数据结构中关于树的一小部分知识 先康康树的样子: 随意介绍一下 : A 就是这个树的根节点,GHIJ是这个树的叶子节点 然后 这个图就不是树,它是什么呢 回答:森林(只有两颗树的森林) 然后介绍了和树有关的相关概念 树 : 树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。...

陈杉菜 6716

增益调度控制 —— 理论、案例与交互式 GUI 实现

本文详细介绍了增益调度控制的基本原理、数学模型及公式推导,探讨了该方法在适应非线性系统和大范围工作条件下的优势与局限。通过航空飞行控制、发动机推力控制以及化工过程控制三个典型案例,我们展示了如何利用调度变量动态调整控制增益,从而使得控制系统在各个工作点均能达到优良性能。为帮助工程师和研究者更直观地理解并验证增益调度控制的实际效果,本文提供了一套基于 Python 与 PyQt6 的交互式 GUI 控制系统代码。用户不仅可以实时查看仿真数据,还能通过在线调节参数直观体验调度控制的优势。

闲人编程的博客 1480

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

树的三种存储结构(详细基础)

6.2树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构----"树",考虑它的各种特性,来解决我们在编程中碰到的相关问题。 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>...

CSer 3万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构c语言——树的三种存储结构(双亲表示法、孩子表示法、兄弟表示法)

在大量的应用中,人们曾使用多种形式的存储结构来表示树。这里,我们介绍3种常用的链表结构。 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置,其形式说明如下: 例如,图6.13展示一棵树及其双亲表示的存储结构。 这种存储结构利用了每个结点(除根以外)只有惟一的双亲的性质。PARENT(T,x)操作可以在常量时间内实现。反复调用PARENT操作,直到遇见无双亲的结点时,便找到了树的根,这就是ROOT(x)操作的执行过程。但是,在这种表示法中,求结点

hey,欢迎浏览我的博客,希望能给你提供帮助。 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

树的概念及存储结构(双亲表示法,孩子表示法,孩子兄弟表示法)

文章目录一. 树的概念二. 树的存储结构(一). 双亲表示法(二). 孩子表示法1. 定长结点链表存储结构2. 孩子链表存储结构(三). 孩子兄弟表示法 一. 树的概念 树(Tree)是n(n>=0)个结点的有限集。 当 n = 0 时,称为空树。 在任意一颗非空树中: 有且仅有一个特定的称为 根(Root) 的结点; 如上图,A为根 当 n > 1 时,其余结点可分为m(m &...

So_cute_SJM的博客 5433

双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换

树的存储结构一、双亲表示法 一、双亲表示法 实现:定义数组结构存放树的结点,每个结点含两个域: 数据域:存放结点本身数据信息。 双亲域:指示本结点的双亲结点在数组中的位置。 结点结构表示为: data parent data是数据域,parent是指针域 例如: 可表示为: r=0,n=10.(根结点位置和结点个数) 这样的存储结构,根据结点parent指针很容易找到它的双...

ker的博客 5万+

树的存储结构:双亲表示法、孩子表示法、孩子兄弟法

文章目录双亲表示法孩子表示法孩子兄弟法 双亲表示法 实现:定义结构数组存放树的结点,每个结点包含两个域: 数据域:存放结点本身信息 双亲域:指示本结点的双亲结点在数组中的位置 结点结构: 结点类型定义: typedef struct PTNode {//结点类型定义 TElemType data; int parent; //双亲位置域 }PTNode; 另外,用 r 存储根结点的下...

wmy0217_的博客 9051

树的双亲表示法,孩子表示法以及孩子兄弟表示法

文章目录树的双亲表示法树的孩子表示法树的孩子兄弟表示法 顺序存储和链式存储,本节来学习如何存储具有普通树结构的数据。 树的双亲表示法 双亲表示法采用顺序表(也就是数组)存储普通树,其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其父节点位置的变量。 注意,根节点没有父节点(父节点又称为双亲节点),因此根节点记录父节点位置的变量通常置为 -1。 /* * @Description: 树的双亲表示法 * @Version: V1.0 * @Autor: Carlos * @Date:

嵌入式与Linux那些事的博客 8926

C++ 树、树的存储结构(双亲表示法,孩子表示法,双亲孩子表示法)

双亲表示法 双亲表示法的特点就是每一个节点里面除了存放节点数据之外,还存放着该节点的双亲节点位置。 #include<iostream> #define maxTree 100 using namespace std; typedef struct//双亲节点 { string data;//节点数据 int parent;//节点的双亲节点下标 }Pparent; typedef struct { Pparent nodes[maxTree];//节点数组 int r, n;//r代表

weixin_43975276的博客 3837

树的存储结构的设计及递归遍历(前序,后序,层序)算法实现——【Java数据结构与算法笔记】

文章目录树的定义及基本术语树的定义树的基本术语树的遍历先序遍历后序遍历层序遍历树的存储结构双亲表示法代码实现线性结构和树结构的比较二叉树二叉树定义二叉树的基本术语满二叉树完全二叉树 树的定义及基本术语 树的定义 树:n (n ≥ 0 )个结点的有限集合,当n=0时,称为空树;任意一棵非空树T满足以下条件︰ 有且仅有一个特定的称为根的结点; 当n > 1时,除根结点之外的其余结点被分成m ( m > 0)个互不相交的有限集合T1,T2… ,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。

stormzhuo的博客 1万+

树的双亲表示法&孩子表示法代码实现

孩子表示法 孩子链存储结构的类型声明 typedef struct { int child; //孩子结点在数组中的位置 struct CTNode *next; //下一个孩子 }CTNode; typedef struct { ElemType data; struct CTNode *firstChild; //第一个孩子 }CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; int n,r; //结点数和根的位置 }CTree;

Miss Z的博客 7305

树的三种存储结构

6.2树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构----"树",考虑它的各种特性,来解决我们在编程中碰到的相关问题。 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>O)个互不相交

朝花夕拾 3万+

树的孩子兄弟表示法完整代码实现

#include<stdio.h> #include<malloc.h> typedef char ElemType; #define MaxSize 15 typedef struct CSNode { ElemType data; struct CSNode* firstchild, * nextsibling; }CSNode, * CSTree; typedef struct { CSNode* data[MaxSize]; //存放栈中的数据元素 int top;

Miss Z的博客 8632
上一篇: 在C++中,用“new”自定义动态数组
下一篇: 【二叉树】二叉树的首次认识:名词理解、种类、存储结构
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值