【问题描述】
以二叉链表的形式创建二叉树(不超过20个结点),并编写二叉树的遍历算法,实现二叉树的先序、中序及后序三种遍历。
【输入形式】
输入二叉树的结点信息(以先序遍历方式建立二叉树)。
【输出形式】
输出二叉树的先序、中序及后序三种遍历序列。
【样例输入1】
A
B
C
#
#
#
#
【样例输出1】
preorder:ABC
inorder:CBA
postorder:CBA
【样例输入2】
A
B
#
#
C
#
#
【样例输出2】
preorder:ABC
inorder:BAC
postorder:BCA
在二叉树的建立之前需要了解二叉树的遍历。
建立二叉树:
以二叉链表作为存储结构,按先序遍历序列建立二叉树。
按照先序遍历的递归过程生成结点,建立二叉树的二叉链表,因此生成二叉树的算法也是递归的。按照A B C # # D E # G # # F # # # 的顺序依次读入字符可以建立该二叉树的二叉链表。创建过程中,遇到 # 表示空树。递归生成如下:
(1)读入 A 创建 A 结点;
(2)先序遍历创建 A 的左子树,读入 B 创建结点 B ,B 为 A 的左孩子;
(3)先序遍历创建 B 的左子树,读入 C 创建结点 C ,C 为 B 的左孩子;
(4)先序遍历创建 C 的左子树,读入 # ,C 的左子树为空。
(5)先序遍历创建C 的右子树,读入 #,C 的右子树为空;B 的左子树创建完毕;
(6)先序遍历创建 B 的右子树,读入 D ,创建结点 D ,D 为 B 的右孩子;
依次建立 D 的左右子树,直至全部数据读完,二叉链表创建结束。
算法如下:
void createBiTree(BiTree *t)
{
//此处补充代码,完成以先序遍历方式建立二叉树
char s;
BiTree q;
s=getchar();
getchar();
if(s=='#')
{
* t=NULL;
return;
}
q=(BiTree)malloc(sizeof(struct BTNode)); //创建根结点
if(q==NULL)
{
exit(0);
}
q->data=s;
*t=q;
createBiTree(&q->lchild); //递归建立左子树
createBiTree(&q->rchild); //递归建立右子树
}
完整代码的实现:
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define MAX 20
//二叉链表结点定义
typedef struct BTNode
{
char data ;
struct BTNode *lchild;
struct BTNode *rchild ;
}*BiTree;
void createBiTree(BiTree *t)
{
//此处补充代码,完成以先序遍历方式建立二叉树
char s;
BiTree q;
s=getchar();
getchar();
if(s=='#')
{
* t=NULL;
return;
}
q=(BiTree)malloc(sizeof(struct BTNode));
if(q==NULL)
{
exit(0);
}
q->data=s;
*t=q;
createBiTree(&q->lchild);
createBiTree(&q->rchild);
}
void PreOrder(BiTree p)
{
//此处补充代码,完成二叉树的先序遍历
if(p!=NULL)
{
printf("%c",p->data);
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
void InOrder(BiTree p)
{
//此处补充代码,完成二叉树的中序遍历
if(p!=NULL)
{
InOrder(p->lchild);
printf("%c",p->data);
InOrder(p->rchild);
}
}
void PostOrder(BiTree p)
{
//此处补充代码,完成二叉树的后序遍历
if(p!=NULL)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
printf("%c",p->data);
}
}
int main()
{
//此处补充代码,调用二叉树的三种遍历函数完成遍历并按要求输出对应遍历序列
BiTree t=NULL;
createBiTree(&t);
printf("\npreorder:");
PreOrder(t);
printf("\ninorder:");
InOrder(t);
printf("\npostorder:");
PostOrder(t);
printf("\n");
return 0;
}
运行结果如下: