//author: cqm
//date: 2004-9-4
//description: 二叉树的递归操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char DataType;
typedef struct node
{
DataType data;
struct node *lchild,*rchild;
}BiTNode;
typedef BiTNode * BiTree;
//建立二叉树
void CreateBiTree(BiTree * T)
{
char c;
printf("进入 CreateBiTree...\n");
scanf("%c",&c);
getchar();
if(c == ' ')
{
printf("不产生子树。\n");
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode)); //生成一个新节点
(*T)->data = c;
printf("产生左右子树。\n");
CreateBiTree(&(*T)->lchild); //生成左子树
CreateBiTree(&(*T)->rchild); //生成右子树
}
}
//前序遍历
void Preorder(BiTNode * T)
{
if(T)
{
printf("%c\n",T->data);
Preorder(T->lchild); //遍历左子树
Preorder(T->rchild); //遍历右子树
}
}
//中序遍历
void Inorder(BiTNode * T)
{
if(T)
{
Inorder(T->lchild);
printf("%c\n",T->data);
Inorder(T->rchild);
}
}
//后序遍历
void Postorder(BiTNode * T)
{
if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c\n",T->data);
}
}
void main()
{
BiTree T = NULL;
char j;
int flag = 1;
//-------------程序解说---------------
printf("本程序实现二叉树的操作。\n");
printf("可以进行建立二叉树,递归先序、中序、后序遍历。\n");
printf("请将先序遍历二叉树的结果输入已建立二叉树。\n");
printf("对于叶子节点以空格表示。\n");
printf("例如:abc de g f (回车) 如下二叉树:\n");
printf(" a \n");
printf(" / \n");
printf(" b \n");
printf(" / \\ \n");
printf(" c d \n");
printf(" / \\ \n");
printf(" e f \n");
printf(" \\ \n");
printf(" g \n");
CreateBiTree(&T); //初始化树
while(flag)
{
printf("请选择: \n");
printf("1.递归先序遍历\n");
printf("2.递归中序遍历\n");
printf("3.递归后序遍历\n");
printf("4.退出程序\n");
scanf("%c",&j);
getchar();
switch(j)
{
case '1':
if(T)
{
printf("先序遍历二叉树:");
Preorder(T);
printf("\n");
}
else printf("二叉树为空!\n");
break;
case '2':
if(T)
{
printf("中序遍历二叉树:");
Inorder(T);
printf("\n");
}
else printf("二叉树为空!\n");
break;
case '3':
if(T)
{
printf("后序遍历二叉树:");
Postorder(T);
printf("\n");
}
else printf("二叉树为空!\n");
break;
default:
flag=0;printf("程序运行结束,按任意键退出!\n");
}
}
}