二叉树的遍历包括递归和非递归。
非递归中又可以分为先序、中序、后序遍历(利用栈实现)和层次遍历(利用队列实现)。代码如下:
//实现二叉树的先序、中序、后序、层次遍历
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct BiTreeNode{
char data;
BiTreeNode *lchild;
BiTreeNode *rchild;
}*BiTree;
//创建一个二叉树
void CreatBiTree(BiTree &root)
{
char data;
data=getchar();
if(data=='#')
root=NULL;
else
{
root=new BiTreeNode();
root->data=data;
CreatBiTree(root->lchild);
CreatBiTree(root->rchild);
}
}
//中序遍历-利用栈
void InOrderTraverse1(BiTreeNode *T)
{
BiTreeNode *p;
stack<BiTreeNode*> S;
S.push(T);
while(!S.empty())
{
while(p=S.top())//向左遍历直到为空
{
p=p->lchild;
S.push(p);
}
S.pop();//空指针出栈
if(!S.empty())//访问节点向右一步
{
p=S.top();
cout<<p->data<<" ";
S.pop();
p=p->rchild;
S.push(p);
}
}
cout<<endl;
}
//中序遍历-利用栈
void InOrderTraverse2(BiTreeNode *T)
{
BiTreeNode *p=T;
stack<BiTreeNode*> S;
while(p||!S.empty())
{
if(p)//根指针进栈,遍历左子树
{
S.push(p);
p=p->lchild;
}
else//根指针退栈,访问根节点,遍历右子数
{
p=S.top();
cout<<p->data<<" ";
S.pop();
p=p->rchild;
}
}
cout<<endl;
}
//先序遍历-利用栈
void PreOrderTraverse(BiTreeNode *T)
{
stack<BiTreeNode*> S;
BiTreeNode *p=T;
while(p||!S.empty())
{
while(p)//访问根节点,右子树进栈,向左走到尽头
{
cout<<p->data<<" ";
S.push(p->rchild);
p=p->lchild;
}
if(!S.empty())
{
p=S.top();
S.pop();
}
}
cout<<endl;
}
//后序遍历-利用栈
//必须分清返回根节点时,是从左子树返回的,还是从右子树返回的。
//故添加一个辅助指针,其指向最近访问过的节点
void PostOrderTraverse(BiTreeNode *T)
{
stack<BiTreeNode*> S;
BiTreeNode *p=T;
BiTreeNode *r=NULL;//指向最近访问过的结点
while(p||!S.empty())
{
if(p)//根指针进栈,遍历左子树
{
S.push(p);
p=p->lchild;
}
else
{
p=S.top();
if(p->rchild&&p->rchild!=r)//左子树为空,右子树不为空且未被访问
{
p=p->rchild;
S.push(p);
p=p->lchild;
}
else//访问根节点
{
S.pop();
cout<<p->data<<" ";
r=p;
p=NULL;
}
}
}
cout<<endl;
}
//层次遍历-利用队列
void HierarchyBiTree(BiTreeNode *T)
{
queue<BiTreeNode*> Q;
BiTreeNode *p;
Q.push(T);
while(!Q.empty())
{
p=Q.front();
Q.pop();
cout<<p->data<<" ";
if(p->lchild)
Q.push(p->lchild);
if(p->rchild)
Q.push(p->rchild);
}
cout<<endl;
}
void main()
{
BiTree root=NULL;
CreatBiTree(root);
cout<<"Inuput End!"<<endl;
InOrderTraverse1(root);
InOrderTraverse2(root);
PreOrderTraverse(root);
PostOrderTraverse(root);
HierarchyBiTree(root);
}