头文件binarytree.h代码如下
#include<iostream> using namespace std; template <class T> struct BTNode { BTNode(){ lChild = rChild = NULL; } BTNode(const T& x){ element = x; lChild = rChild = NULL; } BTNode(const T& x, BTNode<T>* l, BTNode* r){ element = x; lChild = l; rChild = r; } T element; BTNode<T>* lChild, *rChild; }; template <class T> class BinaryTree { public : BinaryTree(){ root = NULL; } ~BinaryTree(); bool IsEmpty() const; void Clear(); bool Root(T& x) const; void MakeTree(const T& x, BinaryTree<T>& left, BinaryTree<T>& right); void BreakTree(T& x, BinaryTree<T>& left, BinaryTree<T>& right); void PreOrder(void (*Visit)(T& x)); //先序遍历二叉树 void InOrder(void(*Visit)(T& x)); void PostOrder(void(*Visit)(T& x)); // int TreeHeight(); void Leaf(); void Copy(BinaryTree<T>& x); protected: BTNode<T>* root; private: void Clear(BTNode<T>* &t); void PreOrder(void(*Visit)(T& x), BTNode<T>* t); void InOrder(void(*Visit)(T& x), BTNode<T>* t); void PostOrder(void(*Visit)(T& x), BTNode<T>* t); // int TreeHeight(BTNode<T>* t); void Leaf(BTNode<T>* t); BTNode<T>* Copy(BTNode<T>* t); }; ... ... ... //复制二叉树 template <class T> void BinaryTree<T>::Copy(BinaryTree<T>& x) { x.root = Copy(root); } template <class T> BTNode<T>* BinaryTree<T>::Copy(BTNode<T>* t) { if (t){ BTNode<T>* q = new BTNode<T>(t->element); q->lChild = Copy(t->lChild); q->rChild = Copy(t->rChild); return q; } }
main.cpp代码如下
#include"bianrytree.h" #include<iostream> using namespace std; void main(void){ BinaryTree<char> a, b, x, y, z; char e; y.MakeTree('E', a, b); z.MakeTree('F', a, b); x.MakeTree('C', y, z); y.MakeTree('D', a, b); z.MakeTree('B', y, x); cout << "先序遍历" << endl; z.PreOrder(Visit); cout << "复制的二叉树,先序遍历" << endl; BinaryTree<char> k = new BinaryTree<char>(); z.Copy(k); k.PreOrder(); }
出现下面错误:百度搜了一下,发现了这个回答
在类的成员中涉及指针成员时,通常会存在这种内存管理的问题。
因为存在着同一内存地址被多个指针指向的问题,所以不能使用默认构造函数、默认拷贝和赋值函数。你需要重载他们。
编写这些函数,建议采用:
1 引用计数。在多个指针指向时,将引用计数增加或减少,为0时delete掉对象。
2 每个对象单独申请空间。针对指针的拷贝或赋值转换为指针指向对象的拷贝或赋值。
但是没怎么看懂,先放在这里吧
Comments | NOTHING