建立一个二叉树,并能分别利用先序、中序、后序和层次四种不同的遍历方法输出结点元素。
实现算法如下:
BTree.h
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;
//创建二叉树
void CreateBTree(BTNode *&b,char *str)
{
BTNode *St[MaxSize],*p; //St数组作为顺序栈
int top = -1,k,j=0; //top为栈顶指针
char ch;
b=NULL;
ch=str[j]; //初始时二叉链为空
while(ch!='\0') //循环扫描str中的每个字符
{
switch(ch)
{
case '(':top++;St[top]=p;k=1;break; //开始处理左孩子结点
case ')':top--;break; //栈顶结点的子树处理完毕
case ',':k=2;break; //开始处理右孩子结点
default:p=(BTNode *)malloc(sizeof(BTNode)); //创建一个结点,由p指向
p->data = ch; //存放结点值
p->lchild = p->rchild = NULL; //左右指针都设置为空
if(b==NULL) //若尚未创建根结点
b=p; //p所指结点为根结点
else
{
switch(k)
{
case 1:St[top]->lchild = p; break; //新建结点作为栈结点的左孩子
case 2:St[top]->rchild = p; break; //新建结点作为栈结点的右孩子
}
}
}
j++; //继续扫描str
ch = str[j];
}
}
//先序遍历
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
//中序输出
void InOrder(BTNode *b)
{
if(b!=NULL)
{
InOrder(b->lchild);
printf("%c",b->data);
InOrder(b->rchild);
}
}
//后序输出
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PostOrder(b->lchild);
PostOrder(b->rchild);
printf("%c",b->data);
}
}
//层次输出
void LevelOrder(BTNode *b)
{
BTNode *qu[MaxSize],*p;
int rear=-1,front=-1;
qu[++rear]=b;
while(rear!=front)
{
front=(front+1)%MaxSize;
p=qu[front];
printf("%c",p->data);
if(p->lchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if(p->rchild!=NULL)
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
源程序
#include<stdio.h>
#include<malloc.h>
#include"BTree.h"
#define MaxSize 100
void main()
{
BTNode *b;
char str[MaxSize];
printf("输入二叉树字符串:");
gets(str);
CreateBTree(b,str);
printf("先序输出:");
PreOrder(b);
printf("\n");
printf("中序输出:");
InOrder(b);
printf("\n");
printf("后序输出:");
PostOrder(b);
printf("\n");
printf("层次输出:");
LevelOrder(b);
printf("\n");
}