二叉查找樹是一種特殊的二叉樹,這種樹上不存在重複的結點,而且它上面的左子樹都比其父結點小,它上面的右子樹都比其父結點大。值得注意的是:具有相同數據的二叉查找樹會隨着數據插入順序不同而不同。
在treeNode.h中
#ifndef TREENODE_H
#define TREENODE_H
template <typename NodeType> class tree;
template <typename NodeType>
class treeNode
{
friend class tree<NodeType>;
public:
treeNode()
:left(0),right(0),m_Data(0)
{}
treeNode(const NodeType &set)
:left(0),right(0),m_Data(set)
{}
NodeType &GetData() const {return m_Data}
private:
treeNode<NodeType> *left;
treeNode<NodeType> *right;
NodeType m_Data;
};
#endif
在tree.h中
#ifndef TREE_H
#define TREE_H
#include "treeNode.h"
template <typename NodeType>
class tree:private treeNode<NodeType>
{
public:
tree();
void AddNode(const NodeType &);
void preOrderTraversal() const;
void inOrderTraversal() const;
void postOrderTraversal() const;
private:
void AddNodeHelper(treeNode<NodeType> **,const NodeType &);
void preOrderHelper(treeNode<NodeType> &) const;
void inOrderHelper(treeNode<NodeType> &) const;
void postOrderHelper(treeNode<NodeType> &) const;
treeNode<NodeType> *rootNode;
};
#endif
在tree.cpp中
#include "tree.h"
#include <iostream>
using std::cout;
using std::endl;
template <typename NodeType>
tree<NodeType>::tree()
:rootNode(0)
{
cout << "tree is begin /n" ;
}
template <typename NodeType>
void tree<NodeType>::AddNode(const NodeType &New_Data)
{
AddNodeHelper(&rootNode,New_Data);
}
template <typename NodeType>
void tree<NodeType>::AddNodeHelper(treeNode **rootPtr,NodeType const &New_Data)
{
if(*rootPtr==0)
{
*rootPtr = new treeNode<NodeType>(New_Data);
}
else
{
if((*rootPtr)->m_Data > New_Data) AddNodeHelper(&(*rootPtr)->left,New_Data);
else if((*rootPtr)->m_Data < New_Data) AddNodeHelper(&(*rootPtr)->right,New_Data);
}
}
template <typename NodeType>
void tree<NodeType>::preOrderTraversal() const
{
preOrderHelper(*rootNode);
}
template <typename NodeType>
void tree<NodeType>::preOrderHelper(treeNode &node) const
{
if(&node != 0)
{
cout << node.m_Data << "/t" ;
preOrderHelper(*(node.left));
preOrderHelper(*(node.right));
}
}
template <typename NodeType>
void tree<NodeType>::inOrderTraversal() const
{
inOrderHelper(*rootNode);
}
template <typename NodeType>
void tree<NodeType>::inOrderHelper(treeNode &node) const
{
if(&node != 0)
{
inOrderHelper(*(node.left));
cout << node.m_Data << "/t" ;
inOrderHelper(*(node.right));
}
}
template <typename NodeType>
void tree<NodeType>::postOrderTraversal() const
{
postOrderHelper(*rootNode);
}
template <typename NodeType>
void tree<NodeType>::postOrderHelper(treeNode &node) const
{
if(&node !=0)
{
postOrderHelper(*(node.left));
postOrderHelper(*(node.right));
cout << node.m_Data << "/t" ;
}
}
在main.cpp中
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include "tree.h"
#include "tree.cpp"
int main()
{
tree<int> test;
int temp;
cout << "請輸入10個整數:/n" ;
for (int i=0;i<10;i++)
{
cin >> temp ;
test.AddNode(temp);
}
test.inOrderTraversal();
test.postOrderTraversal();
cin >> temp ;
return 0;
}
值得注意的幾點:
1.template<typename XXX>在類的實現時要放到每一個該類成員函數的前面;
2.聲明其他類模板時要這樣:template <typename XXX> class XXX;
3.在類模板實例化時要顯式的寫入類型 XXX<type>;
4.在類模板定義時要引用該類模板在template <typename XXX>中顯式聲明的XXX
5.注意“&”與“*”的相互轉換;
6.const類型的成員函數在調用其他函數時要注意其他函數不能修改類中的其他成員,即const類似於* const this;
7.理解樹中的遞歸思想。