二叉树基本操作
①前序遍历
根节点->左子树->右子树
template <class T>
void BTree<T>::PreOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//前序遍历
{
if(t)
{ Visitchar(t->element);
PreOrder(Visit,t->lchild);
PreOrder(Visit,t->rchild);
}
}
②中序遍历
左子树->根节点->右子树
template <class T>
void BTree<T>::InOrder (void (*Visit)(BTNode<T>* u),BTNode<T>* t)//中序遍历
{
if (t)
{
InOrder(Visit,t->lchild);
Visitchar(t->element);
InOrder(Visit,t->rchild);
}
}
③后序遍历
左子树->右子树->根节点
template <class T>
void BTree<T>::PostOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//后序遍历
{
if (t)
{
PostOrder(Visit,t->lchild);
PostOrder(Visit,t->rchild);
Visitchar(t->element);
}
}
④计算结点个数
template <class T>
int BTree<T>::Size()
{
return Size(root);
}
template <class T>
int BTree<T>::Size(BTNode<T>*t)//递归算法,求取二叉树节点个数
{
if (!t) return 0;
else return Size(t->lchild)+Size(t->rchild)+1;
}
采用多文件方式实现:
Main.cpp: #include"BTree.h" #include<iostream> using namespace std; int main(){ BTree<char> a,b,x,y,z; char e; y.MakeTree('E',a,b); z.MakeTree('F',a,b); x.MakeTree('C',y,z); y.MakeTree('D',a,b); z.MakeTree('B',y,x); cout<<"PreOrder: "; z.PreOrder(Visit); cout<<endl; cout<<"InOrder: "; z.InOrder(Visit); cout<<endl; cout<<"PostOrder: "; z.PostOrder(Visit); cout<<endl; cout<<"LevelOrder: "; z.LevelOrder(Visit); cout<<endl; z.BreakTree(e,y,x); cout<<"After break the tree e,y,x: "; x.PreOrder(Visit); return 0; } BTree.h: #include "head.h" #include"queue.h" #include "iostream" using namespace std; template<class T> class BTree { public: BTree(){root=NULL;} ~BTree(){} bool IsEmpty()const; bool Root(T &x)const; void MakeTree(const T &e ,BTree<T>& left, BTree<T>& right); void BreakTree(T &e ,BTree<T>& left,BTree<T>& right); void PreOrder(void (*Visit)(BTNode<T>* u)) { PreOrder(Visit,root); } void InOrder(void (*Visit)(BTNode<T>* u)) { InOrder(Visit,root); } void PostOrder(void (*Visit)(BTNode<T>* u)) { PostOrder(Visit,root); } BTNode<T>* root; void PreOrder(void (*Visit)(BTNode<T>*u), BTNode<T>*t); void InOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t); void PostOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t); void LevelOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t); }; //判断二叉树是否为空 template<class T> bool BTree<T>::IsEmpty() const { return root==NULL; } //求二叉树根结点的值 template <class T> bool BTree<T>::Root(T &x) const { if (root) { x=root->element; return true; } else return false; } template <class T> void BTree<T>::MakeTree(const T &e, BTree<T>& left, BTree<T>& right) { cout<<"here in BTree<T>::MakeTree"<<endl; if(root||&left==&right) return; root=new BTNode<T>(e,left.root,right.root); left.root=right.root=NULL; } template <class T> void BTree<T>::BreakTree(T &e,BTree<T>&left, BTree<T>& right) { cout<<"here in BTree<T>::BreakTree."<<endl; if(!root||&left==&right||left.root||right.root)return; e=root->element; left.root=root->lchild; right.root=root->rchild; delete root; root=NULL; } template <class T> void BTree<T>::PreOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//前序遍历 { if(t) { PreOrder(Visit,t->lchild); Visitchar(t->element); PreOrder(Visit,t->rchild); } } template <class T> void BTree<T>::InOrder (void (*Visit)(BTNode<T>* u),BTNode<T>* t)//中序遍历 { if (t) { Visitchar(t->element); PreOrder(Visit,t->lchild); PreOrder(Visit,t->rchild); } } template <class T> void BTree<T>::PostOrder(void (*Visit)(BTNode<T>* u),BTNode<T>* t)//后序遍历 { if (t) { PreOrder(Visit,t->lchild); PreOrder(Visit,t->rchild); Visitchar(t->element); } } /*实现二叉树的按层遍历,用到了一个队列(第三章中的循环队列) 首先将根结点入队列,当对列不为空的时候:取队首元素,输出队首元素, 将队首元素的左右结点入队列,删除队首元素。如此循环直到队列为空。 该程序不是递归算法。 */ template <class T> void LevelOrder(void (*Visit)(BTNode<T>* u), BTNode<T>*t)//层次遍历 { Queue<BTNode<T> *> Q; Q.EnQueue(t); while(!Q.IsEmpty()){ Q.DeQueue(t); Visit(t); if(t->lchild !=NULL) Q.EnQueue(t->lchild); if(t->rchild!=NULL) Q.EnQueue(t->rchild); } } Queue.h: #include<iostream> using namespace std; template<class T> class Queue { public: virtual bool IsEmpty()const=0; virtual bool IsFull()const=0; virtual bool Front(T &x)const=0; virtual bool EnQueue(T x)=0; virtual bool DeQueue()=0; virtual void Clear()=0; }; Head.h: #include<iostream> using namespace std; template<class T>class BTree;//Note template<class T> class BTNode { public: BTNode(){lchild = rchild = 0;} BTNode(const T & x){ element = x; lchild = rchild = 0;} BTNode(const T& x,BTNode<T> *l,BTNode<T> *r) { element = x; lchild = l; rchild = r; } T element; BTNode<T> *lchild,*rchild; class BTree<T>; void Visit(BTNode<T> *); void Visitchar(char a); }; template<class T> void Visit(BTNode<T> * p ) { cout<<p->element<<" "; } void Visitchar(char a) { cout<<a<<" "; } BTNode.h: template <class T> class BTree; template <class T> class BTNode { public: BTNode(){ lchild=rchild=NULL; } BTNode( const T& e ) { element=e; lchild=rchild=NULL; } BTNode(const T& e, BTNode<T> *l, BTNode<T>*r) { element=e; lchild=l; rchild=r; } T element; BTNode<T> *lchild, *rchild; class BTree<T>; void Visit(BTNode<T>*); void Visitchar(char a); void Print(BTNode<T>*); }; template<class T> void Visit(BTNode<T>* p) { cout<<p->element<<" "<,endl; } template<class T> void Visitchar(char a) { cout<<a<<" "<<endl; }

浙公网安备 33010602011771号