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;