一、多叉树转二叉树的方法
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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效