总结网上一位大牛写的代码,看看人家,就写一个二叉树,就把C++继承多态的作用发挥出来,看咱只能简单定义一个class, 差距大啊~自己还是小白~
BinaryTree.h
#ifndef BINARY_TREE
#define BINARY_TREE
#include <iostream>
#include <string>
#include <stdexcept>
#include <stack>
using namespace std;
enum ChildID{LEFTCHILD = 0, RIGHTCHILD};//子节点类型,左节点or右节点;
template<class T> class BinaryTree;
template<class T> class BTreeNode
{
friend class BinaryTree<T>;
public:
BTreeNode(): pParent(0), pLChild(0), pRChild(0){}
BTreeNode(T elem, BTreeNode<T>* parent=0, BTreeNode* lchild=0, BTreeNode* rchild=0):
pParent(parent),pLChild(lchild),pRChild(rchild),data(elem) {}
T GetData() const; //获取节点数据;
T& GetDataRef(); //不应当提供这样的接口,这里仅仅让iterator能够自由访问存储的数据;
BTreeNode* GetParent() const;//获取节点的父节点
BTreeNode* GetLChild() const;//获取节点的左孩子节点
BTreeNode* GetRChild() const;//获取节点的右孩子节点
void SetData(const T& elem );//修改节点的数据;
/*下面是更改节点的指针域结构的function,是否真的需要,还得仔细考量
做为树的节点,一般不允许直接访问节点中的指针数据,如果这些数据在树
被建立完成以后修改,会破坏树的结构;*/
void SetParent( BTreeNode<T>* parent, ChildID CHID ); //设置当前节点的父节点,并指定当前节点作为子节点的类型;
void SetLeft( BTreeNode<T>* left); //设置当前节点的左子节点;
void SetRight( BTreeNode<T>* right); //设置当前节点的右子节点;
private:
BTreeNode<T>* pParent;
BTreeNode<T>* pLChild;
BTreeNode<T>* pRChild;
T data;
};
//declare BTreeNode end
//*********************************************************
// BTreeNode Implementation
//*********************************************************
template<class T> T BTreeNode<T>::GetData() const
{ return data;}
template<class T>T& BTreeNode<T>::GetDataRef()
{ return data;}
template<class T>T BTreeNode<T>::GetParent() const
{ return pParent;}
template<class T>T BTreeNode<T>::GetRChild() const
{ return pRChild;}
template<class T>T BTreeNode<T>::GetLChild() const
{ return pLChild;}
template<class T>T BTreeNode<T>::SetData(const T& elem)
{ data = elem;}
template<class T>void BTreeNode<T>::SetParent(BTreeNode<T>* parent, ChildID CHID )
{
if(!parent) return;
if(CHID==LEFTCHILD) //当前节点作为parent的左子节点;
{
pParent = parent;
parent->pLChild = this;
}
else if (CHID==RIGHTCHILD)
{
pParent = parent;
parent->rLChild = this;
}
}
template<class T>void BTreeNode<T>::SetLeft(BTreeNode<T>* left)
{ pLChild=left; }
template<class T>void BTreeNode<T>::SetRight(BTreeNode<T>* right)
{ pRChild=right; }
// BTreeNode Implementation over
//*********************************************************
//*********************************************************
template<class T> class BinaryTree
{
public:
BinaryTree() : root(NULL){}
BinaryTree( T value) : RefValue(value), root(NULL) {}
BinaryTree( const BinaryTree<T>& tree); //copy ConstruBcture privated
BinaryTree<T>& operator=(const BinaryTree<T>& tree); //operator= privated
virtual ~BinaryTree();
virtual int IsEmpty(){return root==NULL;}
/*
* 下面三个函数的可用性,返回值类型的正确性值得考量
* 这样做不仅会破坏树的结构,而且很容易引起内存泄漏
* 在一般的树中最好不要提供这三个接口 ;
*/
virtual BTreeNode<T>* Parent( BTreeNode<T>* current ); //返回所给结点父结点;
virtual BTreeNode<T>* LeftChild( BTreeNode<T>* current); //返回节点的左孩子;
virtual BTreeNode<Ty>* RightChild( BTreeNode<T>* current); //返回节点的右孩子;
virtual bool Insert( const T& item); //插入元素;
virtual bool Find( const T& item) const; //搜索元素;
const BTreeNode<T>* GetRoot() const; //取树根;
//遍历操作
void PreOrder() const; //前序;
void InOrder() const; //中序;
void PostOrder() const; //后序;
//二叉树特性操作函数
int Size() const;
int Size( const BTreeNode<T>* troot) const;
int Height() const;
int Height( const BTreeNode<T>* troot) const;
bool operator==( const BinaryTree<T>& tree) const;
//下面的接口是以不同的方式来构建二叉树
BinaryTree<T>& AutoCreateTree(const std::string& expstr); //自动判断格式并建立
BinaryTree<T>& PreOrderCreateTree(const std::string& expstr); //先序建立
BinaryTree<T>& PostOrderCreateTree(const std::string& expstr); //后续建立
protected:
BTreeNode< T>* Parent( BTreeNode<T>* start, BTreeNode<T>* current );
int Insert( BTreeNode<T>* current, const T& item);
void Travers( BTreeNode<T>* current, std::ostream& out ) const;
void Find( BTreeNode<T>* current, const T& item ) const;
void destroy( BTreeNode<T>* current);
//遍历递归
void InOrder( BTreeNode<T>* current) const;
void PreOrder( BTreeNode<T>* current ) const;
void PostOrder( BTreeNode<T>* current) const;
//二叉树特性递归操作函数
BTreeNode<T>* Copy( BTreeNode<T>* troot, BTreeNode<T>* parent);
bool equal( BTreeNode<T>* troot1, BTreeNode<T>* troot2) const;
//建树用的递归函数
BTreeNo