C语言森林转换成二叉树和二叉树转换成森林等的递归算法。
假定普通树采用定长结点结构,而二叉树采用二叉链表结构
(1) 树转换成二叉树的算法:
(i) 将原树的根结点转换为二叉树的根结点;
(ii) 将原树根结点的所有子树按顺序逐一的转换为二叉树,将第一棵二叉树
作为二叉树根结点的左子树,后一棵二叉树做为前一棵二叉树的根结点
的右子树。
代码:
#define MAX_DEGREE 10 //结点度的最大值
typedef struct CTNode{ //普通定长结点结构
TElemType data; //结点的数据域
struct CTNode *childs[TREE_DEGREE]; //孩子链域数组
} CTNode, * GenTree;
typedef struct BiTNode{ //二叉树的结点结构
TElemType data; //二叉树结点的数据域
struct BTNode *lchild , *rchild; //左、右孩子链域
}BiTNode, *BiTree;
Status TreeConvertBiTree(GenTree gentree, BiTree &bitree){
if(!gentree) return OK;
if(bitree = (BiTree)malloc(sizeof(BiTNode))) {
bitree->data = gentree->data;
bitree->lchild = bitree->rchild = NULL;
}
else exit(OVERFLOW);
TreeConvertBiTree(gentree-> childs[0], bitree-> lchild);
for(i = 1; i <= MAX_DEGREE; i++){
if(gentree-> childs[i]){
BiTree bitree;
TreeConvertBiTree(gentree->childs[i], bitree);
gentree-> childs[i-1]->rchild = bitree;
}
}
return OK;
}
(2) 二叉树转换成树的算法:
(i) 将二叉树的根结点转换为树的根结点,然后转到左子树;
(ii) 将子树的根结点与它的右子树断开,然后转化为一棵二叉树,将该二
叉树的根结点与树的根结点相连;
(iii) 转到断开的右子树,继续执行(2);
(iv) 反复执行(2)和(3),直到右子树为空。
代码:
Status BiTreeConvertTree(BiTree bitree, GenTree &gentree){
if(!bitree) return OK;
if(gentree = (GenTree)malloc(sizeof(CTNode))) {
gentree->data = bitree->data;
for(k = 0; k < MAX_DEGREE; k++) gentree->childs[k] = NULL;
}
else exit(OVERFLOW);
BiTree rtree = bitree->lchild->rchild;
bitree->lchild->rchild = NULL;
BiTreeConvertTree(bitree->lchild, gentree->childs[0])
i = 1;
while(rtree){
BiTree temptree = rtree->rchild;
rtree->rchild = NULL;
BiTreeConvertTree(rtree, gentree->childs[i]);
i++;
rtree = temptree;
}
return OK;
}
(3) 森林转换成二叉树的算法:
(i) 将森林F = {T1, T2,⋯,Tm} 中的每棵树都转换成二叉树。
(ii) 按森林中树的次序,从最后一棵二叉树开始,每棵二叉树都作为
前一棵二叉树的根结点的右子树,依次类推。
代码:
Status ForestConvertBiTree(GenTree trees[], int n, BiTree &bitree){ //森林有n棵树,
//存在数组trees中
if(!n) return OK;
BiTree bitrees[n];
for(i = 0; i < n; i++){
TreeConvertBiTree(trees[i], bitrees[i]);
}
for(i = 0; i < n-1; i++){
bitress[i]->rchild = bitress[i+1];
}
bitree = bitress[0];
return OK;
}
(4) 二叉树转换成森林的算法:
(i) 将二叉树B的根结点与其右孩子以及沿右链向下的所有右孩子的连线
全部去掉,得到若干棵二叉树;
(ii)将每棵二叉树还原成一般树。
代码:
GenTree * BiTreeConvertForest(BiTree bitree, int &n){ //n返回森林中树的个数
if(!bitree) return NULL;
n = 0;
tmptree = bitree;
while(tmptree) {//计算二叉树从根结点起的右链长度,等于森林中树的个数
n++;
tmptree = tmptree->rchild;
}
GenTree *trees = (GenTree *)malloc(n * sizeof(GenTree));
i = 0;
tmptree = bitree;
while(tmptree){
rtree = tmp->rchild;
tmp->rchild = NULL;
BiTreeConvertTree(tpmtree, trees[i]);
tmptree = rtree;
i++;
}
return trees;
}