0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

树的递归结构和树的存储结构分析

454398 来源:机器之心 作者:小小 2020-10-16 14:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

树的递归结构

从一张图中解释什么是树

这张图,主要讲解关于cart这个单词的所有的可能组合,按照常理,需要先考虑三个字母的排列,然后对三个字母进行拆分,直到最后一个节点,这个过程就类似于树 到底什么是树

什么是树

树是节点集合(A tree is a collection of nodes),

集合:集合是允许一个元素都没有的集合,称之为空集。

首先,集合是允许一个元素都没有的集合,称之为空集,那么书是不是也允许一个节点都没有的呢,是的,一个节点都没有的树,称之为空树,如果不是空的,则会存在根节点r和零个或更多非空子树,T1,T2.。。Tk,他们的根由来自r的有向连接,什么叫有向边,大致可以理解为箭头。用图的关系说明树的内部关系

根节点(root)一棵树只有一个跟节点,所有的节点都在该节点的下面,尝试把图倒过来看,可以看成一个我们日常见到的数的根部,在这里显然字母A就是这颗树的根节点。

子节点,父节点,一个节点,它对应的下面有连这的节点,那么被连着的节点就是这个节点的子节点,也叫做孩子,那么这个节点叫做被连接的节点的父亲,看图,B被A连这,所以B是A的一个孩子,同理,CDE等等这一行都是A的孩子,同时F,它连这K L M 同时被A连这,那么F是A的一个孩子,同时又是K L M 的父亲。

树叶:树叶就是那些没有孩子的节点,比如B,C,D等等,例如下图的绿色部分。

兄弟: 按照我们的理解,同一个父母生的当然是兄妹,如下图所示,颜色相同的都是兄妹

路径 我们同样可以定义从父亲到他孩子的路径,下面的路径,我们就取上图的一部分,一个子树,作为例子

比如,A->O的路径为A->E->J->O它的长度为3,实际为它的边数,图中红色的部分。

节点的深度:节点的深度指的是节点到树根的长度,看下图,我们可以轻易的知道,j节点的深度为2,可以理解为 A-> E -> J 边长为2.显然,此时根节点的深度为0.

节点的高度:高度是从节点到叶子的最长路径,比如节点F的高度为1,显然所有叶子节点高度为0.

树的高度,树的高度是跟的高度,显然在这图中,树的高度为3,A->O

树的特点

按照正常的逻辑,一个人不能同时有两个父亲,所以树也一样,下图的两个就解释了这个问题

一颗正常的树,它的树枝是不会长成一个圆的,所以,树中,是不可能出现环形的。图中,红色箭头构成了一个环,所以都不是一颗树。

树的存储结构

树的存储结构有三种,分别为,双亲表示法,孩子表示法,孩子兄弟表示法。

双亲表示法

假设一组连续空间保存着树的特点,同时在每个节点中,附带一个指示器表示双亲节点中链表的为位置,也就是说,每个节点除了知道自己是谁以外,还知道他的双亲在哪里。

其中data是数据域,存储结点的数据信息。而parent是指针域,存储该结点的双亲在数组中的下标。

//树的双亲表示法结点结构定义
#define MAX_TRUE_SIZE 100
typedef int TElemType //树结点的数据类型

//结点结构
typedef struct PTNode   
{
	TElemType data;  //结点数据
	int parent;   	//双亲位置
}PTNode

//树结构
typedef struct
{
	PTNode nodes[MAX_TRUE_SIZE];  //结点数组
	int r,n     //根的位置和结点数
}PTree

有了这样的数据结构就可以来实现双亲表示法。由于根结点是没有双亲的,所以我们约定根结点的位置域设置为-1,这也就意味着,我们所有的结点都存有他双亲的位置。如图1-2中的树结构和表1-3中的树双亲表示。

这样的存储结构,我们可以根据结点的parent’指针很容易找到他的双亲结点,时间复杂度为O(1),直到parent为-1时,表示找到了树结点的根

孩子表示法

换一种完全不同的考虑方法,由于树中每个结点可能有多棵子树,可以考虑用多重链表。每个结点有多个指针域,其中每个指针指向一颗子树的根结点,我们把这种方法叫做多重链表的表示方法。不过,树的每个结点的度,也就是他的孩子个数是不同的,所以设计两种方法:

方案一

指针域的个数就等于树的度,树的度就是树各个结点度的最大值。其结构如图

其中data是数据域,child1到childd是指针域,用来指向该结点的孩子结点。对于图1-1来说,树的度是3,所以我们指针域个数就是3,

方案二

每个结点指针域的个数等于该结点的度,我们专门取一个位置来存储结点指针的个数。

data为指针域,degree为度域,也就是存储该结点的孩子结点的个数

这就是我们要说的孩子表示法,把每个结点的孩子都排列起来,以单链表为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组,

为此,设计两种存储结构,一个是孩子链表的孩子结点,

child是数据域,用来存储某个结点在表头数组中的下标。next是指针域,用来存储指向结点的下一个孩子结点的指针。另一个是表头数组的表头结点。

data是数据域,存储某结点的数据信息,firstchild是头指针域,存储该结点的孩子链表的头指针。

//树的孩子表示法结构定义
#define MAX_TRUE_SIZE 100
typedef struct CTNode  //孩子结点
{
	int child;
	struct CTNode *next;
}*ChildPtr;
//表头结构
typedef struct
{
	TElemType data;
	ChildPtr firstchild;
}CTBox;
//树结构
typedef struct
{
	CTBox nodes[MAX_TRUE_SIZE];  //结点数组
	int r,n;               //根的位置和结点数
}CTree

把把双亲表示法和孩子表示法综合一下表示如下

这种表示法叫做双亲孩子表示法,应该算是孩子表示法的改进。

孩子兄弟表示法

任一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此。我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟。

data是数据域,fitstchild为指针域,存储该结点的第一个孩子结点的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储位置。

//孩子兄弟表示法结构定义
typedef struct CSDNode
{
	TElemType data;
	struct CSNode *firstchild,*rightsib;
}CSNode,*CSTree;

这种方法的示意图如下所示

这种表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到此结点的长子,然后在通过长子结点的rightsib找到它的二弟,接着一直找下去,直到找到具体的孩子。
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    41365
  • 存储结构
    +关注

    关注

    0

    文章

    21

    浏览量

    9915
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    E203工程源码时钟解析

    我们使用的是芯来科技提供的hbirdv2_E203软核以及芯来科技MCU200T开发板,板上的FPGA芯片是XILINX的XC7A200T-FBG484。 通过分析顶层模块MCU200T
    发表于 10-29 07:25

    Verilog实现使用Booth编码和Wallace的定点补码乘法器原理

    是Wallace结构和CSA结构的对比。其结构的关键特性在于利用不规则的树形结构对所有的准备好输入数据的运算及时并行处理。 3.3
    发表于 10-23 08:01

    科技,被起诉

    电子发烧友网综合报道 天眼查显示,近日,杭州宇科技股份有限公司(以下简称“宇科技”)新增1条开庭公告,原告为杭州露韦美日化有限公司(以下简称“露韦美日化”),案由为侵害发明专利权纠纷,该案将于8
    的头像 发表于 08-26 07:50 4522次阅读
    宇<b class='flag-5'>树</b>科技,被起诉

    LABVIEW递归获取列表显示到树形结构

    我这个递归我逻辑没问题啊!我断点调试看了,是因为重入VI执行没有把树形结构里面节点传入到下一个递归调用,进入重调用的时候我看了树形结构里面节点是空的。第一次写入的节点并没有传入到下一次
    发表于 08-07 17:59

    成都汇阳投资关于智元与宇拿下 1.24 亿订单,人形机器人商业化加速

          中国移动招标 1.24 亿元机器人大订单 ,智元与宇中标 近日 ,智元和宇中标 “ 中移( 杭州) 信息技术有限公司人形双足机器人代工服务采购项目 ” ,其中智元中标7800万的全
    的头像 发表于 08-04 13:43 999次阅读

    看点:投资方:宇科技或于科创板IPO 美媒:亚马逊机器人数量接近人类员工 英伟达股价创新高

    给大家带来一些行业资讯: 投资方:宇科技或于科创板IPO 早在2025年的5月29日,宇科技就正式发布通知称,因公司发展需要,杭州宇科技有限公司即日起名称变更为“杭州宇科技股份
    的头像 发表于 07-04 15:08 566次阅读

    看点:宇科技完成C轮融资 曝Meta洽谈聘用Github前CEO 库克透露今年秋天再来中国

    给大家带来一些业界资讯消息:比如备受关注的宇科技、苹果、还有Meta。 宇科技完成C轮融资 近日,据媒体报道,宇科技完成了C轮融资,宇科技的C轮融资由中国移动旗下基金、腾讯、锦
    的头像 发表于 06-20 15:30 664次阅读

    白话理解RCC时钟(可下载)

    时钟就像是单片机的“心脏”,单片机正常工作离不开时钟的支持,下图是我们单片机的时钟 ,它反映了单片机的时钟关系。我们来详细描述一下时钟的工作原理。寄存器上电后有一个复位值,大家看我画红线的这个
    发表于 03-27 13:50 0次下载

    【技术分享】迅为RK3568开发板使用TFTP加载内核设备

    【技术分享】迅为RK3568开发板使用TFTP加载内核设备
    的头像 发表于 02-21 14:04 1120次阅读
    【技术分享】迅为RK3568开发板使用TFTP加载内核设备<b class='flag-5'>树</b>

    求解答,设备问题

    请问,rk3588j要再提取一个USB3.0接口设备怎么改
    发表于 02-20 11:22

    对象存储是什么结构类型?

    对象存储属于非结构化数据存储架构,采用扁平化命名空间结构。其核心通过唯一标识符(ObjectID)定位数据对象,突破传统文件系统的层级目录限制,形成"桶-对象"两级逻辑模型。数据以独立
    的头像 发表于 02-10 11:14 690次阅读

    科技在物联网方面

    科技在物联网领域有多方面的涉及和发展,以下是一些具体信息: 传感器技术合作 与传感器公司合作:宇科技与一些传感器技术公司有合作,例如奥比中光为宇机器狗提供激光雷达及结构光传感
    发表于 02-04 06:48

    使用TFTP加载内核设备

    在嵌入式项目开发中,为了适配新外设、调整硬件资源分配或修复驱动问题,需要频繁修改设备和内核。修改完成后,通常需要重新编译生成镜像,并将其烧录到开发板上进行测试。然而,传统的烧录方式不仅需要连接物理接口,还可能因为镜像体积较大而耗费较长时间,这在开发周期紧张的情况下显得尤为低效。
    的头像 发表于 01-17 15:52 1852次阅读
    使用TFTP加载内核设备<b class='flag-5'>树</b>

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的一项技能。设备的起源设备(Device Tree)是一种描述硬件资源的数据结构,它由uboot传递给Linux内核,被内核解析,内核根据设备中的硬件描述信息加载利用相应驱动资源
    发表于 01-08 08:32

    飞凌嵌入式ElfBoard ELF 1板卡-初识设备之设备组成和结构

    的一项技能。设备的起源设备(Device Tree)是一种描述硬件资源的数据结构,它由uboot传递给Linux内核,被内核解析,内核根据设备中的硬件描述信息加载利用相应驱动资源
    发表于 01-07 09:16