版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Justnow_/article/details/79606352
普通树的遍历、合并及对比
日常开发过程中,我们经常会碰到树这种数据结构,譬如权限树、区域层级树,系统调用链等等,今天想记录一下在某个面试题中碰到的关于树的算法题,通过对该题的解答巩固自身对于数据结构的理解,以及希望给有相同困惑的小伙伴以参考的作用。闲话不多说,我们来看题(如涉及到泄题,还请联系我予以删除)
题目描述
如下图所示,可近似看作系统的一个调用链,A为请求的网关,随着业务的不断拓展,系统调用链结构会慢慢发生变化,逐渐从形态一演化到形态二,经过相应的系统重构及链路优化后:
- 系统E下线
- 系统b、f、H、I上线,且系统F挂载到了新的中间业务系统b下
请对两颗树:先行分别计算高度、统计结点总数,然后进行合并处理,同时计算并输出对比结果
编程要求
写一个树合并和对比的工具类:
1. 计算树的高度、总结点数
2. 合并两颗树
3. 输出两颗树的对比结果
- ADD : b、f、H、I
- DELETE : E
解题分析
根据题目描述,我们发现题中所描述的数据结构为一颗普通的树,我们建立一颗普通树的数据结构并不难。根据描述,我们也不难猜出需要采用递归的方式来解题。分析一下可能存在的难点:
- 普通树的递归遍历如何实现,遍历后如何取得最深的路径(即树高)
- 两棵树进行合并时,如何处理两树节点不平衡问题,以及单节点合并后子节点的合并顺序问题,采用何种遍历方式更合适的问题
- 对于两棵树的比较,假设一个节点被重复挂在了多个节点上,是否判断为新增,统计规则不同,采取的策略也有所不同
- 生成合并树时,在判断去重时,注意去重采取的规则
附上已实现的源代码,感兴趣的同学可直接点击链接下载:普通树的遍历、合并及对比