树的基本术语
结点的度 : 某节点所拥有的子树的个数
树的度 : 树中各结点度的最大值
叶子结点 : 度为 0 的结点
孩子结点 : 某结点的子树的根节点 ;
反之, 结点称为子树的 双亲结点
祖先 : 如果从 x 到 y 有一条路径, x 是 y 的祖先
树的深度/树的高度 : 树中所有结点的最大层数
树的宽度 : 树中每一层结点个数的最大值
P 108~109
树的存储结构
P 110
双亲表示法
data
为存储树中结点的数据信息 ;
parent
为存储该结点的双亲在数组中的下标.
#define MaxSize 100
typedef char DataType;
typedef struct{
DataType data; // 树结点的数据信息
int parent; // 该结点的双亲在数组的下标
} PNode;
typedef struct{
PNode tree[MaxSize];
int treeNum; // 树的结点个数
} PTree;
这种存储结构容易找到结点的双亲结点 , O ( 1 ) O(1) O(1) ; 但很难找到孩子结点
孩子表示法
树的 孩子表示法
是一种基于链表的存储方法, 即把每个结点的孩子排列起来, 看成一个线性表, 且以单链表存储, 称为该结点的孩子链表。 (二叉链表)
#define MaxSize 100
typedef char DataType;
typedef struct ChildNode{ // 定义孩子结点
int child; // 该结点在表头数组的下标
struct ChildNode *next;
} ChildNode;
typedef struct{ // 定义表头结点(双亲结点)
DataType data;
ChildNode *firstchild;
} TreeNode;
typedef struct{ // 树结构
treeNode tree[MaxSize];
int treeNum; // 数的结点个数
} CTree;
孩子表示法不仅表示了孩子结点的信息 , 而且链在同一个孩子链表的结点具有兄弟关系
示意图 : P111
孩子兄弟表示法
又叫二叉链表表示法
链表中每个结点的指针域分别指向第一个孩子结点和此节点的下一个兄弟结点
typedef char DataType;
typedef struct CSNode{
DataType data;
struct CSNode* firstchild, *rightsib;
} CSNode;
CSNode *root; // 定义根节点
struct CSNode* firstchild, *rightsib;
} CSNode;
CSNode *root; // 定义根节点