程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【C++】復制二叉樹函數遇到的問題

【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();

}
 

出現下面錯誤:

捕獲

百度搜了一下,發現了這個回答
在類的成員中涉及指針成員時,通常會存在這種內存管理的問題。
因為存在著同一內存地址被多個指針指向的問題,所以不能使用默認構造函數、默認拷貝和賦值函數。你需要重載他們。
編寫這些函數,建議采用:
1 引用計數。在多個指針指向時,將引用計數增加或減少,為0時delete掉對象。
2 每個對象單獨申請空間。針對指針的拷貝或賦值轉換為指針指向對象的拷貝或賦值。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved