template <class T>
class Link {
public:
T element;
Link<T> *leftchild;
Link<T> *rightchild;
};
template<class T>
class BST : private Link<T> {
typedef Link<T> Node;
typedef Link<T>* 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<class T>
BST<T>::BST() {
root = NULL; //置根节点为空
}
template<class T>
BST<T>::~BST() {
Destroy(); //调用销毁函数
}
template<class T>
void BST<T>::Insert(T &element) {
root = Insert(root, element);
}
template<class T>
Link<T>* BST<T>::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<class T>
void BST<T>::Delete(T &element) {
root = Delete(root, element);
}
template<class T>
Link<T>* BST<T>::Delete(NodePo p, T &element) {
NodePo temp;
cout << "successful\n";
system("pause");
if (!p) { //未找到值 不进行操作
}
else {
if (element < p->element) { //Go left
cout << "Go left\n";
system("pause");
p->leftchild = Delete(p->leftchild, element);
}
else if(element > p->element) { //Go right
cout << "Go right\n";
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<class T>
Link<T>* BST<T>::FindMin(NodePo p) const{ //非递归
if (!p) {
cout << "can't find Min" << endl;
}
else {
while (p->leftchild)
p = p->leftchild;
}
return p;
}
template<class T>
Link<T>* BST<T>::FindMax(NodePo p) const{ //非递归
if(!p)
cout << "can't find Max" << endl;
else
while (p->rightchild)
p = p->rightchild;
return p;
}
template<class T>
void BST<T>::PreDisplay() {
PreDisplay(root);
}
template<class T>
void BST<T>::PreDisplay(NodePo p) {
if (!p) {
return;
}
cout << p->element << endl;
PreDisplay(p->leftchild);
PreDisplay(p->rightchild);
return;
}
template<class T>
void BST<T>::Destroy() {
root = Destroy(root);
}
template<class T>
Link<T>* BST<T>::Destroy(NodePo p) {
if (p == NULL ) {
}
else{
p->leftchild = Destroy(p->leftchild);
p->rightchild = Destroy(p->rightchild);
delete p;
}
return p;
}
二叉树模板类实现 还存在许多问题 有关模板类的别名问题还不能解决