ツリーc++テンプレートクラス実装
3877 ワード
template
class Link {
public:
T element;
Link *leftchild;
Link *rightchild;
};
template
class BST : private Link {
typedef Link Node;
typedef Link* NodePo;
public:
BST();
~BST();
void Insert(T &element);
void Delete(T &element);
void Destroy();
void PreDisplay(); //
private:
NodePo root;
void PreDisplay(NodePo p); //
NodePo Destroy(NodePo p); //
NodePo Insert(NodePo p, T &element); //
NodePo Delete(NodePo p, T &element); //
NodePo FindMin(NodePo p) const; //
NodePo FindMax(NodePo p) const; //
};
template
BST::BST() {
root = NULL; //
}
template
BST::~BST() {
Destroy(); //
}
template
void BST::Insert(T &element) {
root = Insert(root, element);
}
template
Link* BST::Insert(NodePo p, T &element) {
if (!p) {
p = new Node;
p->element = element;
p->leftchild = NULL;
p->rightchild = NULL;
}
else {
if (element < p->element) //Go Left
p->leftchild = Insert(p->leftchild, element);
else if (element > p->element) // Go right
p->rightchild = Insert(p->rightchild, element);
else { //
}
}
return p;
}
template
void BST::Delete(T &element) {
root = Delete(root, element);
}
template
Link* BST::Delete(NodePo p, T &element) {
NodePo temp;
cout << "successful
";
system("pause");
if (!p) { //
}
else {
if (element < p->element) { //Go left
cout << "Go left
";
system("pause");
p->leftchild = Delete(p->leftchild, element);
}
else if(element > p->element) { //Go right
cout << "Go right
";
system("pause");
p->rightchild = Delete(p->rightchild, element);
}
else if(p->leftchild && p->rightchild) { //two child
cout << "two child value:" << p->element << endl;
temp = FindMin(p->rightchild);
p->element = temp->element;
element = temp->element;
p->rightchild = Delete(p->rightchild, element);
}
else{ // one child
temp = p;
cout << "one child value:" << p->element << endl;
system("pause");
if (p->leftchild) //p
p = p->leftchild;
else if (p->rightchild) //p
p = p->rightchild;
else
p = NULL;
delete temp;
}
}
return p;
}
template
Link* BST::FindMin(NodePo p) const{ //
if (!p) {
cout << "can't find Min" << endl;
}
else {
while (p->leftchild)
p = p->leftchild;
}
return p;
}
template
Link* BST::FindMax(NodePo p) const{ //
if(!p)
cout << "can't find Max" << endl;
else
while (p->rightchild)
p = p->rightchild;
return p;
}
template
void BST::PreDisplay() {
PreDisplay(root);
}
template
void BST::PreDisplay(NodePo p) {
if (!p) {
return;
}
cout << p->element << endl;
PreDisplay(p->leftchild);
PreDisplay(p->rightchild);
return;
}
template
void BST::Destroy() {
root = Destroy(root);
}
template
Link* BST::Destroy(NodePo p) {
if (p == NULL ) {
}
else{
p->leftchild = Destroy(p->leftchild);
p->rightchild = Destroy(p->rightchild);
delete p;
}
return p;
}
ツリーテンプレートクラスの実装には、テンプレートクラスの別名に関する多くの問題がまだ解決されていません.