数据结构----树----多叉树转二叉树
来源:互联网 发布:mac更新文件夹在哪里 编辑:程序博客网 时间:2024/05/16 09:12
一、多叉树转二叉树的方法
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 31 21 31 4
样例输出
0123
三、代码
注意有森林的情况
#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);}
1 0
- 数据结构----树----多叉树转二叉树
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 数据结构-二叉树算法
- java数据结构:二叉树
- 数据结构---二叉树
- 数据结构(C++)--二叉树
- JAVA 数据结构 二叉树
- 数据结构-二叉树 问题
- 转贴:数据结构:二叉树
- 二叉树(数据结构 c++)
- 数据结构-二叉树操作
- java数据结构----二叉树
- 数据结构二叉树
- 数据结构中的二叉树
- 数据结构--二叉树
- 关于ajax跨域请求问题解决
- Asp.net管道 (第二篇)
- Android模仿奇怪的大冒险主界面表情变化
- UGUI菜单栏伸缩
- 哈希长度扩展攻击以及HashPump
- 数据结构----树----多叉树转二叉树
- 牛客网题目(一)
- request工具类
- HttpApplication处理对象与HttpModule处理模块 (第三篇)
- ping和telnet的区别
- 最简单的贝叶斯分类器演示(含Matlab程序)
- HttpApplication实战大文件上传 (第四篇)
- 设计模式之建造者模式
- FTP YUM 源配置