这里我们讨论树的表示及其遍历操作,并建立森林与二叉树的对应关系。
用到的是孩子、兄弟表示法:链式存储,每个结点包含数据域和两个指针域,左指针指向第一个孩子结点。右指针指向兄弟结点。又称二叉链表存储法。
单颗树的二叉链表存储结构中根结点的右指针必为空,若要存储多棵树组成的森林,可将后一颗树的根结点看成前一颗树根结点的兄弟,即将后一颗树对应的二叉链表拼接到前一颗树根结点的右指针上,这称为森林的孩子-兄弟表示法或二叉链表存储法。
首先是辅助宏:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
#define NULL 0
typedef int Status;
typedef char TElemType;
二叉树的二叉链式存储结构定义:
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild; //左孩子结点 右孩子结点
}BiTNode,*BiTree;
森林的孩子-兄弟表示法的存储结构定义:
typedef struct CSNode{
TElemType data;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
根据已经存在的二叉树BiT 转换成孩子兄弟表示法得到的树或森林T 原二叉树BiT保持不变.
Status BiTreetoTreeorForest(BiTree BiT,CSTree &T){
//根据已经存在的二叉树BiT 转换成孩子兄弟表示法得到的树或森林T 原二叉树BiT保持不变
if(!BiT)
T=NULL;
else{
T=(CSTree)malloc(sizeof(CSNode));
if(!T)
exit(OVERFLOW);
T->data=BiT->data;
BiTreetoTreeorForest(BiT->lchild,T->firstchild);
BiTreetoTreeorForest(BiT->rchild,T->nextsibling);
}
return OK;
}
先序遍历树T(森林的话 先序遍历森林)相当于先序遍历二叉链表存储结构.
Status PrerootTraverse(CSTree T,Status (*visit)(TElemType)){
//先序遍历树T(森林的话 先序遍历森林)相当于先序遍历二叉链表存储结构
if(!T)
return ERROR;
else{
visit(T->data);
PrerootTraverse(T->firstchild,visit);
PrerootTraverse(T->nextsibling,visit);
}
return OK;
}
后序遍历树T(中序遍历森林)相当于中序遍历二叉链表存储结构.
Status PostrootTraverse(CSTree T,Status (*visit)(TElemType)){
//后序遍历树T(中序遍历森林)相当于中序遍历二叉链表存储结构
if(!T)
return ERROR;
else{
PostrootTraverse(T->firstchild,visit);
visit(T->data);
PostrootTraverse(T->nextsibling,visit);
}
return OK;
}
求树或这森林的深度.
int TreeorForestDepth(CSTree T){
//求树或这森林的深度
int d,d1,d2;
if(!T)
d=0;
else{
d1=TreeorForestDepth(T->firstchild)+1;
d2=TreeorForestDepth(T->nextsibling);
d=d1>d2?d1:d2;
}
return d;
}
求树或森林T的叶子数.
int LeafCount_TorF(CSTree T){
/*求树或森林T的叶子数
思路:树看做森林 森林或者为空 或者分为两部分 第一课树,其余树组成的子森林
对后者的叶子树计算可以递归完成 为保证递归时规模的减小 对第一颗树而言 若其
只有一个结点叶子数为1 否则其叶子数为该结点的子树森林的叶子树 ,而子树森林
的叶子数可以递归求得 第一课树的叶子树和其余树组成的子森林的叶子树之和为整
个森林的叶子树*/
int n1,n2;
if(!T)
return 0;
else {
//求第一颗树的叶子树
if(!T->firstchild)
n1=1;
else //第一颗树的子树森林的叶子树
n1=LeafCount_TorF(T->firstchild);
//或其余树组成森林的深度
n2=LeafCount_TorF(T->nextsibling);
}
return n1+n2;
}