二叉搜索树模板






3.65/5 (13投票s)
这是一个类库,可以用来创建任何基本数据类型或类对象的二叉搜索树。
引言
很多时候,我们都需要为不同数据类型创建二叉搜索树。本文介绍了一个名为CTree
的模板库的创建。template <class T> class CTree
可以用来创建任何数据类型的二叉搜索树(BST)。
Using the Code
使用这个类非常简单,只需将所有头文件复制
- Node.h
- ListNode.h
- LinkList.h
- Tree.h
- Treelib.h
到你的项目文件夹中,并在你的应用程序中包含TreeLib.h。之后,创建一个类的实例。
示例
CTree<int> objCTreeInt ; //creating an instance of class
CTree<FLOAT> objCTreeFloat ;
CTree<MYCLASS> objCTreeMyClass ;
特点
该类支持树的所有基本操作。除了基本操作外,它还包括
bool TreeInorderWalk(CNode<T>*) ;
bool TreePreorderWalk(CNode<T>*) ;
bool TreePostorderWalk(CNode<T>*) ;
bool TreeInorderWalk(T & ) ;
bool TreePreorderWalk(T & ) ;
bool TreePostorderWalk(T & ) ;
这些函数执行各种遍历,并按遇到的顺序准备一个包含所有节点的链表。这些链表的指针是CTree
类的一个public
数据成员。
CLinkList<T> *m_pListInorder ;
调用TreeInorderWalk
准备的链表的指针CLinkList<T> *m_pListPreorder ;
调用TreePreorderWalk
准备的链表的指针CLinkList<T> *m_pListPostorder ;
调用TreePostorderWalk
准备的链表的指针
这个列表还支持许多操作,例如
bool AddToFirst(T &);
bool AddToLast(T &);
bool DeleteFirst();
bool DeleteLast();
bool GetNode(T &, CListNode<T> **) ;
约束
在创建任何用户定义类对象的树时,必须在类中重载'==
'、'=
'、'<
'和'>
'运算符,并应包含一个复制构造函数。
方法和说明
bool AddRoot(T & );
添加根元素,仅当根不存在时。bool Insert(T & );
插入一个元素到树中,如果根不存在,也可以插入根。bool Delete(T & );
从树中删除一个元素。bool Search(T & );
搜索一个元素。bool Minimum(T &, T & );
搜索树或子树的最小值,将根的内容作为IN参数传递(见代码)以找到树的最小值。bool Maximum(T &, T & );
Minimum的对应方法。bool Successor(T &, T & );
搜索树或子树的后继,将根的内容作为IN
参数传递(见代码)以找到树的后继。bool Predecessor(T &, T & );
Successor的对应方法。bool Parent(T &, T &) ;
搜索树中节点的父节点。bool Left(T &, T &) ;
搜索树中节点的左子节点。bool Right(T &, T &) ;
搜索树中节点的右子节点。bool TreeInorderWalk(T & ) ;
对树或子树执行中序遍历,并准备一个包含所有遇到的节点的链表。传递根的内容以遍历整个树。bool TreePreorderWalk(T & ) ;
对树或子树执行前序遍历,并准备一个包含所有遇到的节点的链表。传递根的内容以遍历整个树。bool TreePostorderWalk(T & ) ;
Private
方法:: 对树或子树执行后序遍历,并准备一个包含所有遇到的节点的链表。传递根的内容以遍历整个树。bool DeleteTree(T & ) ;
删除一棵树或一个子树。传递根的内容以删除整棵树。bool Delete(CNode<T>* pNode );
从树中删除一个节点。bool Search(T &obj, CNode<T> **pOut);
在树中搜索一个节点,并将其指针返回到out
参数中(见代码)。bool Minimum(CNode<T>* , CNode<T>** );
搜索树或子树的最小值,将指向根的指针作为IN
参数传递(见代码)以找到树的最小值。最小值在OUT
参数中返回(见代码)。bool Maximum(CNode<T>* , CNode<T>** );
Minimum的对应方法。bool Successor(CNode<T>* , CNode<T>** );
搜索节点的后继,将指向根的指针作为IN参数传递(见代码)以找到树的后继。后继在OUT
参数中返回(见代码)。bool Predecessor(CNode<T>* , CNode<T>** );
Successor的对应方法。CNode<T>* Parent(CNode<T>** pNode)
返回指向节点父节点的指针。CNode<T>* Left(CNode<T>** pNode)
返回指向节点左子节点的指针。CNode<T>* Right(CNode<T>** pNode)
返回指向节点右子节点的指针。bool TreeInorderWalk(CNode<T>*) ;
对树或子树执行中序遍历,并准备一个包含所有遇到的节点的链表。传递指向根的指针以遍历整个树。bool TreePreorderWalk(CNode<T>*) ;
对树或子树执行前序遍历,并准备一个包含所有遇到的节点的链表。传递指向根的指针以遍历整个树。bool TreePostorderWalk(CNode<T>*) ;
对树或子树执行后序遍历,并准备一个包含所有遇到的节点的链表。传递指向根的指针以遍历整个树。bool DeleteTree(CNode<T>*) ;
删除一棵树或一个子树。传递指向根的指针以删除整棵树。
此外,使用22到26条目中的方法准备的链表支持以下方法:bool AddToFirst(T &);
在链表开头添加一个节点。bool AddToLast(T &);
在链表末尾添加一个节点。bool DeleteFirst();
从链表开头删除一个节点。bool DeleteLast();
从链表末尾删除一个节点。bool GetNode(T &, CListNode<T> **) ;
检索节点的指针。
最后
我已经测试了这个功能,适用于多种操作,但如果您发现任何错误,请随时告知我。祝您阅读愉快!
历史
- 2006年5月18日:初始发布
