ICHARM
【C++】复制二叉树函数遇到的问题
【C++】复制二叉树函数遇到的问题

头文件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();

}

 

 

 

 

出现下面错误:http://a.icharm.me/wp-content/uploads/2015/11/icharm.me_2015-11-01_11-45-24.png百度搜了一下,发现了这个回答
在类的成员中涉及指针成员时,通常会存在这种内存管理的问题。
因为存在着同一内存地址被多个指针指向的问题,所以不能使用默认构造函数、默认拷贝和赋值函数。你需要重载他们。
编写这些函数,建议采用:
1 引用计数。在多个指针指向时,将引用计数增加或减少,为0时delete掉对象。
2 每个对象单独申请空间。针对指针的拷贝或赋值转换为指针指向对象的拷贝或赋值。
 
但是没怎么看懂,先放在这里吧

发表评论

textsms
account_circle
email

ICHARM

【C++】复制二叉树函数遇到的问题
头文件binarytree.h代码如下 #include<iostream> using namespace std; template <class T> struct BTNode { BTNode(){ lChild = rChild = NULL; } BTNode(const …
扫描二维码继续阅读
2015-11-01