类模板实现二叉查找树

 二叉查找树是一种特殊的二叉树,这种树上不存在重复的结点,而且它上面的左子树都比其父结点小,它上面的右子树都比其父结点大值得注意的是:具有相同数据的二叉查找树会随着数据插入顺序不同而不同。

在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.理解树中的递归思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值