头文件:
#ifndef TREE_H
#define TREE_H
namespace wyp{
template<class T>
class SearchTree;
template<class T>
class TreeNode{
public:
TreeNode() : data(NULL){
}
TreeNode(T data, TreeNode<T> *left, TreeNode<T> *right)
: data(data), left(left), right(right){
}
friend class SearchTree<T>;
private:
T data;
TreeNode<T> *left;
TreeNode<T> *right;
};
template<class T>
class SearchTree{
public:
SearchTree() : root(NULL){
}
virtual ~SearchTree();
void insert(T item);
bool inTree(T item) const;
void inorderShow() const;
private:
void insert(T item, TreeNode<T> *& subTreeRoot);
bool inTree(T item, TreeNode<T> *subTreeRoot) const;
void deleteSubTree(TreeNode<T> *&subTreeRoot);
void inorderShow(TreeNode<T> *subTreeRoot) const;
TreeNode<T> *root;
};
}
#endif
实现:
#include "tree.h"
#include <iostream>
using namespace std;
namespace wyp{
template<class T>
void SearchTree<T>::insert(T item, TreeNode<T> *& subTreeRoot){
if(subTreeRoot == NULL){
subTreeRoot = new TreeNode<T>(item, NULL, NULL);
}else if(item < subTreeRoot->data){
insert(item, subTreeRoot->left);
}else{
insert(item, subTreeRoot->right);
}
}
template<class T>
void SearchTree<T>::insert(T item){
insert(item, root);
}
template<class T>
bool SearchTree<T>::inTree(T item, TreeNode<T> *subTreeRoot) const{
if(subTreeRoot == NULL){
return false;
}else if(subTreeRoot->data == item){
return true;
}else if(subTreeRoot->data > item){
inTree(item, subTreeRoot->right);
}else{
inTree(item, subTreeRoot->left);
}
}
template<class T>
bool SearchTree<T>::inTree(T item) const{
inTree(item, root);
}
template<class T>
void SearchTree<T>::deleteSubTree(TreeNode<T> *&subTreeRoot){
if(subTreeRoot != NULL){
deleteSubTree(subTreeRoot->left);
deleteSubTree(subTreeRoot->right);
delete subTreeRoot;
subTreeRoot = NULL;
}
}
template<class T>
void SearchTree<T>::inorderShow(TreeNode<T> *subTreeRoot) const{
if(subTreeRoot != NULL){
inorderShow(subTreeRoot->left);
cout << subTreeRoot->data << "\t";
inorderShow(subTreeRoot->right);
}
}
template<class T>
void SearchTree<T>::inorderShow() const{
inorderShow(root);
}
template<class T>
SearchTree<T>::~SearchTree(){
deleteSubTree(root);
}
}
利用:
#include <iostream>
#include "tree.h"
#include "tree.cpp"
using namespace std;
using wyp::SearchTree;
int main(){
SearchTree<int> t;
cout << "Enter the number \n";
int next;
cin >> next;
while(next >= 0){
t.insert(next);
cin >> next;
}
cout << "Show tree\n";
t.inorderShow();
cout << endl;
return 0;
}