【实验内容】
建立一个二叉树,并能分别利用先序、中序、后序和层次四种不同的遍历方法输出结点元素。
Input:
1.A(B(D(,G)),C(E,F))
2.A(B(D(H,G)),C(E,F))
结果图:
算法基本流程:
CODE :
/*
Author :LCH南安
*/
#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;
}
}
}
int main(void)
{
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");
return 0;
}