社区
C++ 语言
帖子详情
一个拷贝二叉树的函数问题
sunny3106
2009-11-03 06:28:11
给一个二叉树的根结点,写个函数拷贝整棵树(包含所有树的节点),返回拷贝后的根结点。
这个题想来大家都能够做出来,直接递归就可以了。
现在在这个前提上变化一下,二叉树的节点可以有两个父母,例如下面这个树:
1
/ \
2 3
\ /
4
4这个节点就有两个父母。
这样子的一个变种树,怎么来实现拷贝呢?
...全文
228
7
打赏
收藏
一个拷贝二叉树的函数问题
给一个二叉树的根结点,写个函数拷贝整棵树(包含所有树的节点),返回拷贝后的根结点。 这个题想来大家都能够做出来,直接递归就可以了。 现在在这个前提上变化一下,二叉树的节点可以有两个父母,例如下面这个树: 1 / \ 2 3 \ / 4 4这个节点就有两个父母。 这样子的一个变种树,怎么来实现拷贝呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
二叉树
的先、中、后、层次遍历、构造的实现
使用
二叉树
的链式存储结构,运用
二叉树
的先序,中序,后序遍历递归实现
二叉树
遍历,
二叉树
的构造通过先序序列、线序序列和中序序列、
拷贝
构造
函数
构造完成,实现了
二叉树
节点个数计算,高度计算,关键值查找,节点的...
BiTree
二叉树
//
拷贝
构造
函数
~BiTree(); //析构
函数
void PreOrder(); //先序遍历 void InOrder(); //中序遍历 void PostOrder(); //后序遍历 void LevelOrder(); //层序遍历 int ...
BinaryTree
二叉树
实现
二叉树
的实现,各种方法,构造
函数
,析构
函数
,前序遍历,中序遍历,后续遍历,层次序遍历
拷贝
二叉树
拷贝
二叉树
,就是要
拷贝
根节点,叶子节点,第一步得先分配
一个
空间给根节点, BiTNode* newnode = (BiTNode*)malloc(sizeof(BiTNode));将其叶子节点指向NULL,在判断原树的根节点的左节点和右节点是否为空,不为空...
拷贝
二叉树
C/C++
//
拷贝
二叉树
Node * copyBinaryTree(Node *root) { if (NULL == root) { return NULL; } Node *leftNode = copyBinaryTree(root->left); Node *rlghtNode = copyBinaryTree(root->right); Node *new...
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章