二叉树的复制构造函数 C++
我有一个具有以下定义的 Tree 类:
class Tree {
Tree();
private:
TreeNode *rootPtr;
}
TreeNode 表示一个节点并具有数据、leftPtr 和 rightPtr。
如何使用复制构造函数创建树对象的副本?我想做一些类似的事情:
Tree obj1;
//insert nodes
Tree obj2(obj1); //without modifying obj1.
感谢任何帮助!
I have a Tree class with the following definition:
class Tree {
Tree();
private:
TreeNode *rootPtr;
}
TreeNode represents a node and has data, leftPtr and rightPtr.
How do I create a copy of a tree object using a copy constructor? I want to do something like:
Tree obj1;
//insert nodes
Tree obj2(obj1); //without modifying obj1.
Any help is appreciated!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
伪代码:
具体示例(了解改变树的行走方式很重要,但有损于展示复制构造函数的工作原理,并且可能在这里做了太多某人的作业):
Pseudo-code:
Concrete example (changing how you walk the tree is important to know, but detracts from showing how the copy ctor works, and might be doing too much of someone's homework here):
这取决于您是否想要 浅层或深层复制。假设是深层复制,您需要能够复制挂在
TreeNode
对象上的“叶子”上的任何内容;所以理想情况下,功能应该在TreeNode
中(除非Tree
是TreeNode
的友元类,您设计它是为了非常熟悉它的实现,当然这是经常发生的情况;-)。假设类似...:那么您可以向其中添加一个
If
Tree
正在处理此级别的功能(作为友元类),那么显然您将拥有完全相同的功能,但具有节点被克隆为显式参数。It depends on whether you want a shallow or deep copy. Assuming a deep copy, you need to be able to copy whatever's at the "leaves" hanging off a
TreeNode
object; so ideally the functionality should be inTreeNode
(unlessTree
is a friend class ofTreeNode
that you've designed to be deeply familiar with its implementation, which is often the case of course;-). Assuming something like...:then you could add to it a
If
Tree
is taking care of this level of functionality (as a friend class), then obviously you'll have the exact equivalent but with the node being cloned as an explicit arg.两个基本选项:
如果您有一个可用的迭代器,您可以简单地迭代树中的元素并手动插入每个元素,如 R. Pate 所描述的那样。如果你的树类没有采取明确的措施来平衡树(例如AVL或红黑旋转),那么你最终会以这种方式有效地得到一个节点链表(也就是说,所有左子指针都将为空) )。如果您正在平衡您的树,您将有效地执行两次平衡工作(因为您已经必须在要复制的源树上找出它)。
一种更快但更混乱且更容易出错的解决方案是通过对源树结构进行广度优先或深度优先遍历来自上而下构建副本。您不需要任何平衡旋转,并且最终会得到相同的节点拓扑。
Two basic options:
If you have an iterator available, you can simply iterate over the elements in the tree and insert each one manually, as R. Pate described. If your tree class doesn't take explicit measures to balance the tree (e.g. AVL or red-black rotations), you'll end up effectively with a linked list of nodes this way (that is, all the left child pointers will be null). If you are balancing your tree, you'll effectively do the balancing work twice (since you already had to figure it out on the source tree from which you're copying).
A quicker but messier and more error-prone solution would be to build the copy top down by doing a breadth-first or depth-first traversal of the source tree structure. You wouldn't need any balancing rotations and you'd end up with an identical node topology.
这是我使用二叉树的另一个例子。
在此示例中,节点和树在单独的类中定义,并且
copyHelper
递归函数帮助copyTree
函数。代码并不完整,我试图只包含理解功能如何实现所必需的内容。copyHelper:
copy:返回指向新树的指针
用法:
我希望这对某人有帮助。
Here's another example I used with a binary tree.
In this example, node and tree are defined in separate classes and a
copyHelper
recursive function helps thecopyTree
function. The code isn't complete, I tried to put only what was necessary to understand how the functions are implemented.copyHelper:
copy: returns a pointer to the new tree
Usage:
I hope this helps someone.
当您的类有一个指向动态分配内存的指针时,在该类的复制构造函数中,您需要为新创建的对象分配内存。然后,您需要使用其他指针指向的任何内容来初始化新分配的内存。以下是如何处理具有动态分配内存的类的示例:
When your class has a pointer pointing to dynamically allocated memory, in the copy constructor of that class you need to allocate memory for newly created object. Then you need to initialize newly allocated memory with whatever the other pointer pointing at. Here is an example how you need to deal with a class having dynamically allocated memory:
你可以尝试类似的东西(未经测试)
You can try something like (untested)