[数据结构]树结构的基本概念和理解

1.树的有关基本概念

定义

树(Tree)是n(n=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、……Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

树结构是一对多的结构

相关概念见图。

在这里插入图片描述

线性结构 树结构
第一个数据:无前驱 根结点:无双亲,唯一
最后一个原始:无后继 叶结点:无孩子,可以多个
中间元素:有一个前驱,一个后继 内部结点:一个双亲,可以有多个孩子

2 树的抽象数据类型定义

ADT Tree {

​ 数据对象 D: D 是具有相同特性的数据元素的集合。

​ 数据关系 R:(略)

​ 基本操作 P:

​ {结构初始化}

​ InitTree (&T );

​ 操作结果:构造空树 T。

​ CreateTree (&T, definition);

​ 初始条件: definition 给出树 T 的定义。

​ 操作结果:按 definition 构造树 T。

​ {销毁结构}

​ DestroyTree (&T );

​ 初始条件:树 T 存在。

​ 操作结果:销毁树 T。

​ {引用型操作}

​ TreeEmpty (T)

​ 初始条件:树 T 存在。

​ 操作结果:若 T 为空树,则返回 TURE,否则 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 有右兄弟,则返回它的右兄弟,

​ 否则函数值为“空”。

TraverseTree (T, Visit() )

​ 初始条件:树 T 存在,Visit 是对结点操作的函数。

​ 操作结果:按某种次序对 T 的每个结点调用函数

​ Visit () 一次且至多一次。一旦 Visit ()

​ 失败,则操作失败。

{加工型操作}

ClearTree (&T );

​ 初始条件:树 T 存在。

​ 操作结果:将树 T 清为空树。

InsertChild (&T, &p, i, c);

​ 初始条件:树 T 存在,p 指向 T 中某个结点,1≤i≤p

​ 所指结点的度 + 1,非空树 c 与 T 不相交。

操作结果:插入 c 为 T 中 p 指结点的第 i棵子树。

​ DeleteChild (&T, &p, i);

​ 初始条件:树 T 存在,p 指向 T 中某个结点,

​ 1≤i≤p 所指结点的度。

​ 操作结果:删除 T 中 p 所指结点的第 i 棵子树。

}ADT Tree

3.树结构的存储形式

下面介绍 多重链表存储形式

#define MaxChild 10
#define Elemtype int
typedef struct treeNode{
	Elemtype data;
	struct treeNode *child[MaxChild] ;
}treeNode; 

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ychhh/article/details/84371597