二叉树完整实现C++

本文总结了一位大牛用C++实现二叉树的代码,展示了C++的继承和多态特性。通过对比,作者认识到自己在编程技巧上的不足,表达了学习的决心。
摘要由CSDN通过智能技术生成

总结网上一位大牛写的代码,看看人家,就写一个二叉树,就把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
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值