数据结构----树----多叉树转二叉树

一、多叉树转二叉树的方法

1、输入一颗多叉树


2、找到根节点,把它除最左边的儿子以外的所有儿子的关系断掉


3、从左儿子开始,把同层的兄弟依次连接起来


4、然后对根节点的儿子依次递归进行次操作,最后转出来的二叉树就是这个样子



虽然有点难看,但是它就是一颗二叉树。

5、注意

在图中可以看出根节点的右儿子为空,其实是为了在森林转二叉树的时候更加方便

如图(森林转二叉树的步骤):

1、


2、


3、


4、最终结果



二、例题

多叉树转二叉树

给出一个多叉树,将它转换成二叉树

输入

输入数据:第一行顶点数n,表示有n个顶点,顶点分别为1,2,3……,n。边数为m。顶点数不超过100
接下来m行,每行两个数i,j,表示j的父亲是i。
兄弟中编号小的为左儿子。

输出

输出数据:n行,第i行表示二叉树中第i个节点的父亲编号。根节点父亲为0.

样例输入

4 3
1 2
1 3
1 4

样例输出

0
1
2
3

三、代码

注意有森林的情况

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
    int lc,rc,fa;
}ectree[105];
int dctree[105][105];
bool b[105];
int root[105];
void dfs(int r,int f)
{
    if(r==0) return;
    ectree[r].fa=f;
    if(dctree[r][0]!=0){
        ectree[r].lc=dctree[r][1];
        ectree[dctree[r][1]].fa=r;
        int t=dctree[r][1];
        for(int i=2;i<=dctree[r][0];i++){
            ectree[t].rc=dctree[r][i];
            ectree[dctree[r][i]].fa=t;
            t=dctree[r][i];
        }
    }
    dfs(ectree[r].lc,r);
    dfs(ectree[r].rc,r);
}
int main()
{
    int n,m,i,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        dctree[x][++dctree[x][0]]=y;
        b[y]=1;
    }
    for(i=1;i<=n;i++){
        if(dctree[i][0]!=0)
            sort(dctree[i]+1,dctree[i]+dctree[i][0]+1);
        if(b[i]==0){
            root[++root[0]]=i;
        }
    }
    dfs(root[1],0);
    for(i=2;i<=root[0];i++)
        dfs(root[i],root[i-1]);
    for(i=1;i<=n;i++)
        printf("%d\n",ectree[i].fa);
}


  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值