二叉查找树是一种特殊的二叉树,这种树上不存在重复的结点,而且它上面的左子树都比其父结点小,它上面的右子树都比其父结点大。值得注意的是:具有相同数据的二叉查找树会随着数据插入顺序不同而不同。
在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.理解树中的递归思想。