【数据结构入门】树

#王者杯·14天创作挑战营·第4期#

目录

1.树的概念

父子结点

根节点|叶节点

结点的度

叶子结点或终端结点

兄弟结点

树的度

结点的层次

树的高度或深度

结点的祖先

堂兄弟结点

子孙

森林

2. 树的结构定义

2.1 左孩子右兄弟结构

2.2 数组表示法

3.树&非树


1.树的概念

        树是一种非线性的数据结构,它是由N(N>=0)个有限节点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树。也就是说它是根朝上,叶朝下的。

我们发现树是有一个一个节点构成的,如果一个节点都没有,我们称作“空树”。

父子结点

        通常由一个结点延伸出来的直接结点称作该结点的子结点;例如下图中:1号结点是2号结点的父结点,2号结点是1号结点的子结点。

根节点|叶节点

        没有父结点的结点称为根结点;

        没有子结点的结点称为叶结点。

结点的度

一个结点含有的子树的个数称为该结点的度,上图A的度为6;

叶子结点或终端结点

度为0的节点称为叶结点,上图BCHIPQKLMN,都是叶结点。

兄弟结点

拥有相同的父结点的结点称为兄弟结点,例如KLM是兄弟结点。

树的度

最大结点的度称为树的度,上图中树的度是6

结点的层次

从根开始,根为第一层,根的子结点称为第2层,以此类推。

树的高度或深度

树中结点层次最大的。如上图树的高度为4;

结点的祖先

从根到该结点经过的所有结点,如上图A是所有结点的祖先,P的祖先是AEJ;

堂兄弟结点

双亲在同一层的结点互为堂兄弟结点,例如HI是堂兄弟结点。

子孙

以某节点为根的子树都叫做该结点的子孙。

森林

由M(M>0)棵互不相交的树的集合称为森林。

2. 树的结构定义

        当已知数的度是多少的情况下可以定义树的结构:

#define _CRT_SECURE_NO_WARNINGS
#define N 3 // 假设度为3
typedef struct TreeNode 
{
	int val;
	struct TreeNode* child1[N];
}TreeNode;

        在windows文件资源管理器中,其实就是一棵树,盘符是根结点,但是这棵树没有规定究竟有多少个子节点,也就是说这里没有提前定义这棵树的度。上面那种定义会存在一定程度上的内存浪费。

        我们可以使用顺序表来存,顺序表的每一个元素都是一个结点的指针,这种定义的方式显然也不够好,在底层也会有一定程度的空间浪费。

typedef struct TreeNode 
{
	int val;
	TreeNodeSeqList childs;
}TreeNo

2.1 左孩子右兄弟结构

        在树中有一种非常清晰明了的结构,结构体中存有两个指针,一个指针指向左边第一个孩子,第二个指针指向它的兄弟(亲兄弟)。

typedef struct TreeNode 
{
	int val;
	TreeNode LeftChild;
	TreeNode RightBrother;
}TreeNode;

如图:

我们使用左孩子右兄弟的表示方法表示上面的树:

通过访问根结点的左边第一个孩子,再通过访问它的右兄弟就能将A节点的所有孩子全部访问。

2.2 数组表示法

定义两个数组,第一个数组是存放所有的结点;

第二个数组根据每一个结点存放对应的父结点的下标。

例如A没有父结点,存-1;

B、C的父结点是A,存A的下标0......

3.树&非树

①子树是不相交的。

②每一个结点有且只有一个父结点。

③N个节点有N-1条边。

只需要看树是否构成回路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值