数据结构——树
1 树的定义
树是一对多的数据结构,是n(n>0)个结点的有限集,当n=0时称为空树;在任一棵非空树中,有且仅有一个根结点,当n>1时,除根结点外的其余结点可分为m(m>0)棵互不相交的子树;
1.1 树的概念
结点:包含数据元素及指向子树的指针;
结点的度:结点拥有子树的个数;
树的度:树中所有结点度的最大值;
结点关系:
双亲结点:树中结点A为B、C、D的双亲结点
孩子结点:树中结点B、C、D为A的孩子结点
兄弟结点:树中B、C、D互为兄弟结点
1.2 结点的分类
根结点:没有双亲的结点
内部结点:有双亲,且结点的度不为0的结点
叶子结点:有双亲,且结点的度为0的几点
1.3 结点的层次
结点的层次:
第一层:根结点
第二层:根结点的所有孩子结点
以此类推
树的深度:树中结点的最大层次数
树的顺序:
有序树:树中任意结点的子结点之间有顺序关系
无序树:树中任意结点的子结点之间没有顺序关系,也称自由树;
森林:m棵互补相交的树的集合
2 树的抽象数据类型
ADT树:
data:树是由一个根结点和若干棵子树构成,数据结点具有相同的数据类型及层次关系
operation initTree //构造树T destroyTree(T) //销毁树T creatTree(T) //创建树T clearTree(T) //若树T存在,将树清成空树 treeEmpty(T) //若树T为空,返回true //若树T不为空,返回false treeDepth(T) //获取树T的深度 root(T) //返回树T的根结点 value(T,e) //返回树T的结点e中的数据 assign(T,e,v) //对树T的结点e中的数据赋值v parent(T,e) //返回树T的结点e的父结点 leftChild(T,e) //返回树T的结点e的最左孩子结点 rightSibling(T,e) //返回树T的结点e的右兄弟结点 insertChild(T,e,i,c)//在树T的结点e的度为i+1的位置添加子树c deleteChile(T,e,i) //删除树T的结点e的度为i+1的位置的子树 endADT
3 树的顺序存储结构
3.1 双亲表示法
在一组连续的存储空间中,存储树中的每个结点
每个结点包含:数据元素、其双亲结点的位置
3.2 双亲表示法代码定义
#define TREESIZE 100 typedef int DataType typedef struct TNode { DataType data; int parent; }TNode; typedef struct Tree { TNode nodes[TREESIZE]; int root; int count; }Tree;
3.3 双亲表示法扩展
3.3.1 带一个孩子结点的扩展
3.3.2 带所有孩子结点的扩展
4 树的链式存储结构
在一组连续或者不连续的存储空间中,存储树中的每个结点
每个结点包含:数据元素、其每个孩子结点的指针
4.1 代码定义
#define CHILDSIZE 3 typedef int DataType typedef struct TNode { DataType data; struct TNode *children[CHILDSIZE]; //指针数组 }TNode; typedef struct Tree { TNode *root; int count; }Tree;
4.2 孩子表示法扩展
4.3 孩子表示法扩展
5 顺序、链式组合存储结构
组合表示方法:
将树中的所有结点放到一个数组中;
每个结点的孩子由一个链表表示;
5.1 组合表示法代码定义
#define TREESIZE 100 typedef int DataType typedef struct ChildNode { int child; struct ChildNode *next; }ChildNode; typedef struct TreeNode { DataType data; struct ChildNode *firstChild; }TreeNode; typedef struct Tree { TreeNode nodes[TREESIZE]; int root; int count; }Tree;
5.2 组合表示法扩展
将树中的所有结点放到一个数组中;
每个结点的孩子由一个链表表示;