码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的实现

时间:2016-03-21 02:00:18      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:数据结构、二叉树

#include<iostream>
using namespace std;
#include<queue>
#include<stack>
template<class T>
struct BinaryTreeNode//节点
{
	BinaryTreeNode(const T& x)//构造函数
		:_data(x)
		,_left(NULL)
		,_right(NULL)
	{}
    T _data;
    BinaryTreeNode<T>* _left;
    BinaryTreeNode<T>* _right;
};
template<class T>
class BinaryTree
{
public:
	BinaryTree()//构造函数
		:_root(NULL)//根节点赋空值
	{}
	
	BinaryTree(const T* a,size_t size)//建立二叉树
	{
		size_t index=0;
	    _root=_CreatTree(a,index,size);
	}
	~BinaryTree()//析构
	{
	    Destroy();
	}
	BinaryTreeNode<T>* Copy()
	{
	    return _Copy(_root);
	}
	BinaryTreeNode<T>* Destroy()//删除二叉树
	{
	   return _Deatroy(_root);
	}
	void PrevOrder()//前序遍历
	{
	   _PrevOrder(_root);
	   cout<<endl;
	}
	void InOrder()//中序遍历
	{
	   _InOrder(_root);
	   cout<<endl;
	}
	void PostOrder()//后序遍历
	{
	   _PostOrder(_root);
	   cout<<endl;
	}	
	void LevelOrder()//层次遍历
	{
	    _LevelOrder(_root);
		cout<<endl;
	}
	int Size()//计算大小
	{
	     return _Size(_root);
		 cout<<endl;
	}
	int LeafNum()//叶子节点个数
	{
	     return _LeafNum(_root);
		 cout<<endl;
	}
	int Hight()//计算二叉树高度
	{
	    return _Hight(_root);
	}
	void PrevOrder_Non_R()//非递归前序遍历
	{
	     _PrevOrder_Non_R(_root);
		 cout<<endl;
	}
	void InOrder_Non_R()//非递归中序遍历
	{
	      _InOrder_Non_R(_root);
		  cout<<endl;
	}
	void PostOrder_Non_R()//非递归后序遍历
	{
	      _PostOrder_Non_R(_root);
		  cout<<endl;
	}
protected:
	BinaryTreeNode<T>* _CreatTree(const T* a,size_t& index,size_t size)//创建二叉树
	{
	     BinaryTreeNode<T>* root=NULL;
		 if(index<size&&a[index]!=‘#‘)
		 {
			 root=new BinaryTreeNode<T>(a[index]);//先序创建根节点
		     root->_left=_CreatTree(a,++index,size);//递归创建左节点
			 root->_right=_CreatTree(a,++index,size);//递归创建右节点
		 }
		 return root;
	}
	void _PrevOrder(BinaryTreeNode<T>* root)
	{
	    if(root==NULL)
		{
			return;
		}
		else
		{
		    cout<<root->_data<<" ";
		   _PrevOrder(root->_left );
		   _PrevOrder(root->_right );
		}
	}
	void _InOrder(BinaryTreeNode<T>* root)
	{
	   if(root==NULL)
	   {
	      return;
	   }
	  else
	   {
	      _InOrder(root->_left );
		  cout<<root->_data <<" ";
		  _InOrder(root->_right );
	   }
	}
	void _PostOrder(BinaryTreeNode<T>* root)
	{
		if(root==NULL)
			return;
		else
		{
			_PostOrder(root->_left );
		    _PostOrder(root->_right );
		    cout<<root->_data <<" ";
		}
	}
	void _LevelOrder(BinaryTreeNode<T>* root)//队列的使用
	{
	   queue<BinaryTreeNode<T>*> q;
	   q.push(root);
	   while(root)
	   {
	       cout<<root->_data <<" ";
		   if(!q.empty())
		   {
		      BinaryTreeNode<T>* front =q.front();
			  q.pop();
			  q.push(front->_left );
			  q.push(front->_right );
		   }
		   root=q.front();
	   }
	}
	int _Size(BinaryTreeNode<T>* root)
	{
	    if(root==NULL)
			return 0;
		return  _Size(root->_left )+_Size(root->_right )+1;
	}
	int _LeafNum(BinaryTreeNode<T>* root)
	{
	    if(root==NULL)
			return 0;
		if((root->_left ==NULL)&&(root->_right ==NULL))
			return 1;
		
		return _LeafNum(root->_left )+_LeafNum(root->_right );
	}
	int _Hight(BinaryTreeNode<T>* root)
	{
	    if(root==NULL)
			return 0;
		if(_Hight(root->_left) >_Hight(root->_right ))
		{
		    return  _Hight(root->_left )+1;
		}
		else
		{
		     return _Hight(root->_right )+1;
		}
	}
	BinaryTreeNode<T>* _Copy(BinaryTreeNode<T>* root)
	{
	    if(root==NULL)
			return NULL;
		else
		{
			BinaryTreeNode<T>* r=new BinaryTreeNode<T>(root->_data );
			BinaryTreeNode<T>* left=_Copy(root->_left );
			BinaryTreeNode<T>* right=_Copy(root->_right );
			return r;
		}
	}
	BinaryTreeNode<T>* _Deatroy(BinaryTreeNode<T>*& root)
	{
	   if(root!=NULL)
	   {
	       _Destroy(root->_left );
		   _Deatroy(root->_right );
		   delete root;
		   root=NULL;
	   }
	   return root;
	}
	void  _PrevOrder_Non_R(BinaryTreeNode<T>* root)
	{
	    BinaryTreeNode<T>* cur=root;
		stack<BinaryTreeNode<T>*> s;
		while(cur!=NULL||!s.empty ())
		{
			while(cur!=NULL)
			{
			     cout<<cur->_data <<" ";
				 s.push(cur);
				 cur=cur->_left ;
			}
			if(!s.empty ())
			{
			     cur=s.top();
				 s.pop();
				 cur=cur->_right ;
			}
		}		
	}
	void  _InOrder_Non_R(BinaryTreeNode<T>* root)
	{
	    BinaryTreeNode<T>* cur=root;
		stack<BinaryTreeNode<T>*> s;
		while(cur!=NULL||!s.empty ())
		{
			while(cur!=NULL)
			{
				 s.push(cur);
				 cur=cur->_left ;
			}
			if(!s.empty ())
			{
			     cur=s.top();
				 cout<<cur->_data <<" ";
				 s.pop();
				 cur=cur->_right ;
			}
		}		
	}
	void _PostOrder_Non_R(BinaryTreeNode<T>* root)
	{
		BinaryTreeNode<T>* cur=NULL;
		BinaryTreeNode<T>* temp=NULL;
	    stack<BinaryTreeNode<T>*> s;
		s.push(root);
		while(!s.empty ())
		{
			cur=s.top();
			if((cur->_left ==NULL && cur->_right ==NULL)||
				(temp!=NULL && (temp==cur->_left||temp==cur->_right)))
			{
			   cout<<cur->_data <<" ";
			   s.pop();
			   temp=cur;
			}
			else
			{
			    if(cur->_right !=NULL)
				{
				   s.push(cur->_right );
				}
				if(cur->_left !=NULL)
				{
				    s.push(cur->_left );
				}
			}
		}		
	}
protected:
	BinaryTreeNode<T>* _root;
};


二叉树的实现

标签:数据结构、二叉树

原文地址:http://760470897.blog.51cto.com/10696844/1753230

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!