一、树的基本操作
二、树的存储结构
1.双亲表示法:
示例:
存储表示为:
#define maxnode //树的结点最大个数
template <Class T>
{
T data;//数据域
int parent;//指针域
};
NodeType t[maxnode];
优缺点:该存储方式对于查找双亲和根结点十分方便,但若查找某结点的孩子结点,需要查询整个数组。
2.孩子表示法:
(1)多重链表表示法:
方案一:每个结点指针域的个数等于该结点的度数。
方案二:每个结点指针域的个数等于树的度数。
方案一在一定程度上节约了空间,但由于树中各结点是不同构的,各种操作不容易实现,所以该方案很少采用;方案二各结点是同构的,各种操作相对容易实现,为此付出的代价是存储空间的浪费。
方案一:
方案二:
方案二的存储描述:
#define maxson //树的度
template <Class T>
struct TreeNode
{
T data;
TreeNode <T> *son[maxson]; //孩子结点指针数组
};
(2)孩子链表表示法:
存储描述:
#define maxnode //树中结点最大个数
template <Class T>
struct childnode
{
int childcode;
childnode <T> *nextchild;
};
template <Class T>
struct nodetype
{
T data;
Childnode <T> *firstchild;
};
nodetype t[maxnode];
3.双亲孩子表示法
4.孩子兄弟表示法
每个结点除其信息域外,再增加两个分别指向该节点的第一个孩子结点和下一个兄弟结点的指针
template <Class T>
struct TreeNode
{
T data;
TreeNode <T> *firstchild;//孩子结点
TreeNode <T> *nextsibling;//下一个兄弟结点
};