森林转换成二叉树和二叉树转换成森林的递归算法。

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;
}
         
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值