源程序
递归遍历头文件recursion.h
#include "stack.h"
void pre_traverse(BiTree T)
{
if(T!=NULL)
{
printf("%2c",T->data);
if(T->lchild !=NULL)
pre_traverse(T->lchild);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
}
}
//中序遍历
void mid_traverse(BiTree T)
{
if(T!=NULL)
{
if(T->lchild !=NULL)
pre_traverse(T->lchild);
printf("%2c",T->data);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
}
}
//后序遍历
void post_traverse(BiTree &T)
{
if(T!=NULL)
{
if(T->lchild !=NULL)
pre_traverse(T->lchild);
if(T->rchild!=NULL)
pre_traverse(T->rchild);
printf("%2c",T->data);
}
}
非递归头文件nonrecursion.h
//非递归方法遍历
#include "stack.h"
//先序遍历
void PreOrderTrav(BiTree T)
{
BiTree p;
LiStack S;
InitStack(S);
if(T) Push(S,T);
while(!StackEmpty(S)){
Pop(S,p);
printf("%2c",p->data);
if (p->rchild)Push(S,p->rchild);
if (p->lchild)Push(S,p->lchild);
}
}
//中序遍历
void MidOrderTrav(BiTree T)
{
BiTree p,q;
q=(BiTree)malloc(sizeof(BiTNode));
LiStack S;
InitStack(S);
p=T;
while(p || !StackEmpty(S))
{
while(p)
{
Push(S,p);
p=p->lchild;
}
Pop(S,q);
printf("%2c",q->data);
//Push(S,q->rchild);
p=q->rchild;
}
}
//后序遍历
void PostOrderTrav(BiTree T)
{
BiTree p,q;
q=(BiTree)malloc(sizeof(BiTNode));
LiStack S;
char flag;
InitStack(S);
p=T;
while(p || !StackEmpty(S)){
if(p!=q)
{
while(p)
{
Push(S,p);
if(p->lchild) p=p->lchild;
else
p=p->rchild;
}
}
if(StackEmpty(S)) break;
GetTop(S,q);
if(q->rchild==p)
{
p=(BiTree)malloc(sizeof(BiTNode));
Pop(S,p);
printf("%2c",p->data);
p=q;
flag=p->data;
}
else
{
p=q->rchild;
if(flag==p->data)
{
p=(BiTree)malloc(sizeof(BiTNode));
Pop(S,p);
printf("%2c",p->data);
p=q;
flag=p->data;
}
}
// Pop(S,p);
// printf("%2c",p->data);
}
}
主函数
#include <stdio.h>
#include <stdlib.h>
/*二叉链表的定义*/
//栈的操作,栈中的元素类型为BiTree
#include "stack.h"
#include "recursion.h"
#include "nonrecursion.h"
/* 建立二叉树 */
void CreateBiTree(BiTree &T)
{
TElemType ch;
scanf("%c",&ch);
if (ch==' ')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//求二叉树的叶子个数
int leaf(BiTree T)
{
int n;
if (!T) n=0;
else
if (!T->lchild&&!T->rchild)
n=1;
else
n=leaf(T->lchild)+leaf(T->rchild);
return(n);
}
/*主函数部分,文件名为bintree.c*/
//#include "bintree.h"
void main(){
BiTree root;
int select;
printf("建立二叉树,输入字符序列\n");
CreateBiTree(root);
do{
printf("\n1 递归遍历 2 非递归遍历 3 计算叶子 0 退出\n");
scanf("%d",&select);
switch(select){
case 1:
printf("\n递归遍历:");
printf("\n先序遍历序列:");
pre_traverse(root);
printf("\n中序遍历序列:");
mid_traverse(root);
printf("\n后序遍历序列:");
post_traverse(root);
//PreOrderTrav(root);
break;
case 2:
printf("\n非递归遍历:");
printf("\n先序遍历序列:");
PreOrderTrav(root);
printf("\n中序遍历序列:");
MidOrderTrav(root);
printf("\n后序遍历序列:");
PostOrderTrav(root);
//PreOrderTrav(root);
break;
case 3:
printf("\n二叉树中叶子个数为:%d\n",leaf(root));
break;
case 0:
break;
default:
printf("输入选项错误!重新输入!\n");
}
}while(select);
}
结果
建立二叉树,输入字符序列
abd e c
1 递归遍历 2 非递归遍历 3 计算叶子 0 退出
1
递归遍历:
先序遍历序列: a b d e c
中序遍历序列: b d e a c
后序遍历序列: b d e c a
1 递归遍历 2 非递归遍历 3 计算叶子 0 退出
2
非递归遍历:
先序遍历序列: a b d e c
中序遍历序列: d b e a c
后序遍历序列: d e b c a