一个拷贝二叉树的函数问题

sunny3106 2009-11-03 06:28:11
给一个二叉树的根结点,写个函数拷贝整棵树(包含所有树的节点),返回拷贝后的根结点。
这个题想来大家都能够做出来,直接递归就可以了。

现在在这个前提上变化一下,二叉树的节点可以有两个父母,例如下面这个树:
1
/ \
2 3
\ /
4

4这个节点就有两个父母。
这样子的一个变种树,怎么来实现拷贝呢?

...全文
228 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny3106 2009-11-04
  • 打赏
  • 举报
回复
其实这是道面试题,偶面试时没想出来。

当初我也差不多就这个思路,后来面试官说尽量不用容器,我就晕了,想了下用数组,每次检查时间复杂度要O(n),总时间复杂度就很高,就杯具了……
whg01 2009-11-04
  • 打赏
  • 举报
回复
用数组,就是另一种方法:
malloc一个Node* pAll[];
遍历原树,每个节点被遍历一边,就把其指针放入pAll一次,这样楼主例子中的节点4的指针就会在数组中出现2次。
然后对pAll进行排序。
malloc一个Node* pDup[]; //这里只保存重复出现的节点,重复出现的节点即有2个或2个以上父节点。
同时再建立一个数组Node* pDupCopy[], 用于标记相应pDup中节点的拷贝节点指针。
然后从头到尾扫描pAll,如果一个节点出现2次或2次以上,就将其放入pDup。
这样相当于实现了自己的map。因为只保留了重复引用的节点,所以尺寸会小很多。
cphj 2009-11-03
  • 打赏
  • 举报
回复
也可以不破坏,单独构造一个映射结构,key是节点地址,value是节点是否复制的标记

遍历的时候,把节点地址和是否复制的标记存起来,再用类似的方法就行了,const也没关系
whg01 2009-11-03
  • 打赏
  • 举报
回复
typedef map<Node*, Node*> NODE_COPY; 定义这样一个map,第一个Node*是指向原有的树节点,第二个Node*是指向在拷贝树上相应的节点。
遍历原树的时候,先检查当前节点pOri是否在map中出现;如果未出现,则新建个节点pCopy放在新的拷贝树中;如果已出现,则获取相应的map中pOri对应的pCopy,然后直接设置拷贝数中的指针。
这样就对原有的树没有任何要求。
sunny3106 2009-11-03
  • 打赏
  • 举报
回复
ls的意思是破坏输入的树的结构,在每个节点上加字段标志是否复制过?
这样子感觉不是很好吧。。。输入的是const的呢?
cphj 2009-11-03
  • 打赏
  • 举报
回复
简单的想法:

给传统二叉树节点的数据结构额外加上一个字段,记录该节点是否已复制过

拷贝算法基于传统二叉树的遍历算法,遍历到某个节点拷贝的时候,标记上“已复制”状态,下次再遍历到就不要拷贝,只建立父子链接
sunny3106 2009-11-03
  • 打赏
  • 举报
回复
自己顶一下,up

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧