树的存储结构
目录
1、双亲表示法
由树的定义可知除了根节点除外每个节点都有且仅有一个双亲结点,根据这一特点,可以用一维结构体数组来存储树的各个节点(一般按层序存储),数组中一个数据元素对应一个节点(节点数等于数组的大小),数组元素包括树中节点的数据信息以及该节点的双亲再该结构体数组中的下标。
//数组元素结构体类型定义如下
template <typename T>
struct PNode
{
T data;
int parent;
};
2、孩子表示法
树的孩子表示法是一种基于链表的存储方法,把n个孩子排列起来看成一个线性表,且以单链表存储,称为该节点的孩子链表,n个节点就有n个孩子链表,n个孩子又有n个头指针,这n个头指针又形成了一个线性表,为了方便查找操作可以用顺序存储结构,形成孩子链表的表头数组。孩子表示法中存在两类数组。
//结构体节点类型定义如下
struct CNode
{
int child;
CNode *next;
};
template <typename T>
struct BNode
{
T data;
CNode *firstchild;
};
3、孩子兄弟表示法
树的孩子兄弟表示法又称为二叉链表表示法,其方法是链表中的每个节点除了数据域以外还有两个指针分别指向该节点的第一个孩子和右兄弟。(如果有n个结点,就会又2n个指针域,其中有n-1指针域用来存放孩子结点的地址,这样就会存在n+1个空指针域,可以利用这些空的指针域指向某种遍历的前驱或后继结点,这些指针与就成为线索),加上线索的二叉链表称为线索链表,加上线索的二叉树称为线索二叉树。
//孩子兄弟表示法结点定义
template <typename T>
struct TNode
{
T data;
TNode<T> *FirstChild;
TNode<T> *rightSib;
};
浙公网安备 33010602011771号