#include<stdio.h>
#include<stdlib.h>
#define MAX 9
typedef struct node//结点结构
{
char data;//数据域
struct node *lchild;//左孩子指针
struct node *rchild;//右孩子指针
}BiTNode,*BiTree;//树中结点类型
typedef struct BiTNode_s//树结构
{
char data;
int lchild;//左孩子下标
int rchild;//右孩子下标
BiTNode_s():lchild(-1),rchild(-1){}
}BiTNode_s,*BiTree_s;
int i=1;
//前序法构建二叉树
void PreCreatBiTree(BiTree&T)
{
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
char ch;//结点的值
if((ch=getchar())=='*')//用*表示空
T=NULL;//递归结束,建空树
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));//开辟新的空间
T->data=ch;//生成根结点赋值
PreCreatBiTree(T->lchild);//递归创建左子树
PreCreatBiTree(T->rchild);//递归创建右子树
}
}
//前序遍历,中左右
void PreTravel(BiTree &T)
{
if(T)
{
printf("%c ",T->data); //中
PreTravel(T->lchild); //先左子树
PreTravel(T->rchild); //后右子树
}
}
//中序遍历,左中右
void MidTravel(BiTree&T)
{
if(T)
{
MidTravel(T->lchild);
printf("%c ",T->data);
MidTravel(T->rchild);
}
}
//后序遍历,左右中
void AftTravel(BiTree &T)
{
if(T)
{
AftTravel(T->lchild);
AftTravel(T->rchild);
printf("%c ",T->data);
}
}
//后序遍历将动态二叉树转化为用静态二叉链表
void TreeToArray(BiTree &T,BiTNode_s a[])
{
int k,t; //k用于记录递归调用的每一层此结点对应的数组下标,i在外面就被初始化为1,t用来记录未被赋值的左孩子的下标
if(T->lchild)
{
TreeToArray(T->lchild,a); //递归调用Tree_to_Array函数
k=i;
i++;
a[i].lchild = k; //将左孩子结点对应的下标赋给双亲结点
t=k;
}
else{
a[i].lchild = 0; //没有左孩子结点
t=0;
}
if(T->rchild){
TreeToArray(T->rchild,a); //递归调用Tree_to_Array函数
k=i;
i++;
a[i].rchild = k; //将右孩子结点对应的下标赋给双亲结点的rcjild
if(a[i].lchild==-1) //判断是否存在左孩子未指定的情况
{
a[i].lchild = t;
}
}
else
{
a[i].rchild = 0; //没有右孩子结点
}
a[i].data=T->data;
}
int main()
{
int j;
BiTree T;
BiTNode_s a[MAX];
printf("请按先序遍历顺序输入二叉树的各节点,没有的用符号*代替:\n");
PreCreatBiTree(T);
/* printf("前序遍历结果:\n");
PreTravel(T);*/
printf("\n");
printf("中序遍历结果:\n");
MidTravel(T);
printf("\n");
/*printf("后序遍历结果:\n");
AftTravel(T);*/
printf("\n");
TreeToArray(T,a);
printf("后序遍历转化成静态二叉链表为:\n");
for(j=1;j<MAX;j++)
printf("下标:%d 数据:%c 左孩子:%d 右孩子:%d\n",j,a[j].data,a[j].lchild,a[j].rchild);
return 0;
}
//ABCD***E**FG*H***