博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多叉树转换二叉树
阅读量:6370 次
发布时间:2019-06-23

本文共 1070 字,大约阅读时间需要 3 分钟。

多叉转二叉,前提是我们仍要把树的信息保留下来,也就是谁是谁的孩子,谁是谁的兄弟。但是二叉只能保存两个孩子,但我们可以把两个孩子改成两个关系,也就是我们利用二叉来储存关系,一个是孩子,一个是兄弟。

于是,就出现了网上广泛介绍的方法,当一个节点是另一个节点的孩子时,就放在父亲节点的左孩子上,是兄弟,就该放在右孩子上,也就是所谓的“左儿子,右兄弟”。

当然多叉转二叉的形式不止一种,上图是其中的一种。

因为2,3,4都是1的孩子,所以都位于1的左子树里。至于谁跟1相连,这个顺序不唯一,但不影响,看是如何读取吧。

然后对于2,3,4互为兄弟,所以都放在各自的右子树里。

7是4的孩子,所以7就放在4的左子树上。

5,6是二的孩子,就放在2的左子树上。

5,6互为兄弟,就放到6(或5)的右子树上。

 

实现方法

 

一、

1.读入a,b表示a是b的孩子

2.如果b的左孩子为空,那么a就放在b的左孩子,否则循环b的左孩子的右孩子直到该孩子的右孩子为空为止,放到该孩子的右孩子上。

1 for (int i=1;i<=m;i++) 2 { 3   cin>>a>>b     //a是b的孩子 4   if (tree[b].l==0) tree[b].l=a; 5   else { 6             int tmp=tree[b].l; 7             while (tree[tmp].r!=0) tmp=tree[tmp].r;//直到该孩子没有右孩子为止 8             tree[tmp].r=a; 9           }10 }
代码

 

 二、

当孩子过多的时候,会发现循环可能会过慢,降低效率。

我们还可以用类似储存链式前向星的方法,让父亲的左孩子为读入的孩子,然后这个孩子的右孩子是父亲的之前第一个左孩子。

如:

我们现在读入的是4是1的孩子,按照方法一的话最终是这样的

很明显当右孩子过多的时候,循环可能会过久,方法二减小循环就是这样做的:

读入4是1的孩子,那么

把1的左孩子给4的右孩子

 

然后4给1的左孩子

最终就是这样子啦~

1 for (int i=1;i<=m;i++)2 {3    cin>>a>>b     //a是b的孩子4    tree[a].r=tree[b].l;    //把b的左孩子给a的右孩子5    tree[b].l=a;     //把a给b的左孩子6 }
代码

 

转载于:https://www.cnblogs.com/Lanly/p/6305766.html

你可能感兴趣的文章
OpenPOWER全产业链协同打通大数据Hadoop的再创新轨道
查看>>
阿里巴巴并购安全公司翰海源
查看>>
连云存储魔力象限都进不了,就别提三年之内中国第一了吧!
查看>>
为什么“私有云”计算值得考虑
查看>>
《OpenACC并行程序设计:性能优化实践指南》一 2.3 描述数据移动
查看>>
《数据虚拟化:商务智能系统的数据架构与管理》一 1.7 数据虚拟化的技术优势...
查看>>
新华三新IT 以开放之力助新农信发展
查看>>
企业高效研发实践专场,加速研发效能体系升级
查看>>
为啥神经网络里的BP算法花了那么久才被发明?
查看>>
iOS编程中throttle的那些事
查看>>
智能数据连接世界
查看>>
BMC报告:数字化业务驱动对大型机的需求
查看>>
签订数据中心托管合同所考虑的问题
查看>>
物联网时代的布局核心到底在哪里?
查看>>
秒懂数据统计、数据挖掘、大数据、OLAP的区别
查看>>
TCP是否适用与广域网环境?
查看>>
PHP语言开发Paypal支付demo的具体实现
查看>>
Java Executor 框架学习总结
查看>>
那些容易被忽视的JavaScript细节总结
查看>>
IBM首席执行官提出人工智能部署三大基本原则
查看>>