類模板實現二叉查找樹

 二叉查找樹是一種特殊的二叉樹,這種樹上不存在重複的結點,而且它上面的左子樹都比其父結點小,它上面的右子樹都比其父結點大值得注意的是:具有相同數據的二叉查找樹會隨着數據插入順序不同而不同。

在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; //  treeNode<NodeType> *rootNode;完全可以註釋掉,因爲tree是用繼承的 //方式來實現的,如果不用繼承來實現,則必須有上面的那句話。 }; #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.理解樹中的遞歸思想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章