首先是二叉树的构造。二叉树的结点有一个数据域和两个指针域组成,分别指向其左右子树。以下是二叉树类的声明,主要包含负责建立和销毁以及遍历的函数。
template<class T>
struct BiNode
{
T data;
BiNode<T> *lchild,*rchild;
};
template<class T>
class BiTree
{
public:
BiTree();
BiTree(string Pre,string In);
~BiTree();
BiNode<T>* GetRoot() const;
void PreOrder(BiNode<T> *root) const;
void InOrder(BiNode<T> *root) const;
void PostOrder(BiNode<T> *root) const;
void LevelOrder(BiNode<T> *root) const;
private:
BiNode<T> *root;
BiNode<T>* Creat(string Pre,string In);
BiNode<T>* Creat();
void Release(BiNode<T> *root);
};
二叉树的建立销毁和前序中序后序遍历都是通过递归来实现的,其代码如下。
二叉树的建立:通过键盘输入结点的数据建立二叉树,输入#结点为空。
template<class T>
BiTree<T>::BiTree()
{
this->root = Creat( );
}
template<class T>
BiNode<T>* BiTree<T>::Creat()
{
BiNode<T>* root;
T ch;
cin>>ch;
if (ch =='#')
root = NULL;
else{
root = new BiNode<T>; //生成一个结点
root->data=ch;
root->lchild = Creat( ); //递归建立左子树
root->rchild = Creat( ); //递归建立右子树
}
return root;
}
使构造函数调用私有函数Creat(),再通过键盘输入结点的数据建立二叉树,输入#结点为空。
二叉树的销毁:
template<class T>
BiTree<T>::~BiTree()
{
Release(root);
}
前序 中序 后序遍历:
template<class T>
void BiTree<T>::PreOrder(BiNode<T> *root) const
{
if(root==NULL)
return;
else
{
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::InOrder(BiNode<T> *root) const
{
if(root==NULL)
return;
else
{
InOrder(root->lchild);
cout<<root->data<<" ";
InOrder(root->rchild);
}
}
template<class T>
void BiTree<T>::PostOrder(BiNode<T> *root) const
{
if(root==NULL)
return;
else
{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data<<" ";
}
}
对于二叉树的层序遍历,是通过使用队列来实现的。简单的说就是若第k层的结点处于队列中,在依次出队和输出其数据的同时,将其左右子结点(即k+1层的结点) 入队。
template<class T>
void BiTree<T>::LevelOrder(BiNode<T> *root) const
{
int front=0,rear=0; //采用顺序队列,并假定不会发生上溢
BiNode<T> *Q[100],*q;
if(root==NULL)
return;
Q[++rear]=root;
while(front!=rear)
{
q=Q[++front];
cout<<q->data<<" ";
if(q->lchild!=NULL)
Q[++rear]=q->lchild;
if(q->rchild!=NULL)
Q[++rear]=q->rchild;
}
cout<<endl;
}
至此完成了二叉树的基本构建。根据题目的要求,在此基础上重载构造函数和私有函数Creat(),实现通过前序和中序遍历的结果建立二叉树。代码如下:
template<class T>
BiTree<T>::BiTree(string Pre,string In)
{
this->root=Creat(Pre,In);
}
template<class T>
BiNode<T>* BiTree<T>::Creat(string Pre,string In)
{
BiNode<T> *root=new BiNode<T>;
if(Pre.empty()==true)
{
root=NULL;
return root;
}
string LeftPre,LeftIn,RightPre,RightIn;
char strRoot;
int mid,length;
strRoot=Pre[0]; //在前序中找到根结点字符
length=Pre.length();
mid=In.find(strRoot,0); //在中序中找到根结点字符的位置
LeftIn=In.substr(0,mid);
RightIn=In.substr(mid+1,length-mid-1);
LeftPre=Pre.substr(1,mid);
RightPre=Pre.substr(mid+1,length-mid-1);
root->data=strRoot;
root->lchild=Creat(LeftPre,LeftIn);
root->rchild=Creat(RightPre,RightIn);
return root;
}
同样使用了递归的方法将问题分治,在具体实现时借助string类的方法拆分字符串后传递参数。
可以通过此链接下载本程序:http://cid-24fba8dfcc188fae.skydrive.live.com/self.aspx/Public/BinaryTree.rar