}
//***********层次遍历二叉树**********//
voidLevelOrder(BiTreebt)
{
BiTreequeue[50];
intfront,rear;
if(bt==NULL)
return;
front=-1;
rear=0;
queue[rear]=bt;
while(front!
=rear)
{
front++;
Visite(queue[front]->data);
if(queue[front]->lchild!
=NULL)
{
rear++;
queue[rear]=queue[front]->lchild;
}
if(queue[front]->rchild!
=NULL)
{
rear++;
queue[rear]=queue[front]->rchild;
}
}
}
//**********先序遍历建立二叉树***********//
voidCreateBiTree(BiTree*bt)
{
charch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BiTree)malloc(sizeof(BiTNode));
(*bt)->data=ch;
CreateBiTree(&((*bt)->lchild));
CreateBiTree(&((*bt)->rchild));
}
}
//**********递归先序遍历二叉树bt***********//
voidPreOrder(BiTreebt)
{
if(bt==NULL)return;
cout<data<<"";
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
//**********递归中序遍历二叉树bt***********//
voidInOrder(BiTreebt)
{
if(bt==NULL)return;
InOrder(bt->lchild);
cout<data<<"";
InOrder(bt->rchild);
}
//**********递归后序遍历二叉树bt***********//
voidPostOrder(BiTreebt)
{
if(bt==NULL)return;
PostOrder(bt->lchild);
PostOrder(bt->rchild);
cout<data<<"";
}
//**********非递归先序遍历二叉树bt*********//
voidNRPreOrder(BiTreebt)
{
BiTreestack[20],p;
inttop;
if(bt==NULL)
return;
top=0;
p=bt;
while(!
(p==NULL&&top==0))
{
while(p!
=NULL)
{
Visite(p->data);
if(top<20-1)
{
stack[top]=p;
top++;
}
else
{
cout<<"溢出!
";
return;
}
p=p->lchild;
}
if(top<=0)
return;
else
{
top--;
p=stack[top];
p=p->rchild;
}
}
}
//**********非递归中序遍历二叉树bt***********//
voidNRInOrder(BiTreebt)
{
BiTreestack[20],p;
inttop;
if(bt==NULL)
return;
top=0;
p=bt;
while(!
(p==NULL&&top==0))
{
while(p!
=NULL)
{
if(top<20-1)
{
stack[top]=p;
top++;
}
else
{
cout<<"溢出!
";
return;
}
p=p->lchild;
}
if(top<=0)
return;
else
{
top--;
p=stack[top];
Visite(p->data);
p=p->rchild;
}
}
}
//*********非递归后序遍历二叉树bt************//
voidNRPostOrder(BiTreebt)
{
stacktypestack[50];
BiTreep;
inttop,sign;
if(bt==NULL)
return;
top=-1;
p=bt;
while(!
(p==NULL&&top==-1))
{
if(p!
=NULL)
{
top++;
stack[top].link=p;
stack[top].flag=1;
p=p->lchild;
}
else
{
p=stack[top].link;
sign=stack[top].flag;
top--;
if(sign==1)
{
top++;
stack[top].link=p;
stack[top].flag=2;
p=p->rchild;
}
else
{
Visite(p->data);
p=NULL;
}
}
}
}
//********主函数***********//
voidmain()
{cout<<"请输入序列:
"<BiTreebt;
CreateBiTree(&bt);
cout<<"\n层次遍历:
";
LevelOrder(bt);
cout<<"\n\n先序、中序、后序遍历的递归实现:
";
cout<<"\n先序遍历:
";
PreOrder(bt);
cout<<"\n中序遍历:
";
InOrder(bt);
cout<<"\n后序遍历:
";
PostOrder(bt);
cout<<"\n\n先序、中序、后序遍历的非递归实现:
";
cout<<"\n先序遍历:
";
NRPreOrder(bt);
cout<<"\n中序遍历:
";
NRInOrder(bt);
cout<<"\n后序遍历:
";
NRPostOrder(bt);
cout<<"\n\n";
}
五、测试结果及功能说明
六、设计体会
1.通过这次试验,使我更加牢固得掌握了二叉树的建立和各种方式的遍历,感到数的建立,递归二叉树的先序、中序、后序遍历都很简单,非递归先序、中序、后序遍历用到了数组和栈,层次遍历用到了队列,代号为复杂点。
2.我意识到在编程过程中,养成良好的编程习惯很重要,否则出错后要浪费大量的时间在找错上,这样既降低了编程的效率,也不利于自己在编程方面的发展。