//动态二叉树的先根遍历,中根遍历、后根遍历和转换成静态二叉链表
代码:
#include<stdio.h>
#include<stdlib.h>
#define N 20
typedef struct node //节点创建
{
char data;
struct node *lchild,*rchild;
int index;
}Binary_Tree;
typedef struct tree //静态二叉树结点
{
char data;
int lchild;
int rchild;
}Treenode;
static int i=0,n=0;
Binary_Tree *Create_actiontree() //用递归方法创建树
{
Binary_Tree *Tree;
char c;
scanf("%c",&c);
if(c==' ')
Tree=NULL;
else
{
Tree=(Binary_Tree*)malloc(sizeof(Binary_Tree));
Tree->data=c;
Tree->index=i++;
Tree->lchild=Create_actiontree(); //递归左子树
Tree->rchild=Create_actiontree(); //递归右子树
}
return Tree;
}
void prioritiesTraverse(Binary_Tree *Tree) //递归方法先序遍历
{
if(Tree)
{
printf("%c ",Tree->data);
prioritiesTraverse(Tree->lchild);
prioritiesTraverse(Tree->rchild);
}
}
void middleTraverse(Binary_Tree *Tree) //递归方法中序遍历
{
if(Tree)
{
middleTraverse(Tree->lchild);
printf("%c ",Tree->data);
middleTraverse(Tree->rchild);
}
}
void lastTraverse(Binary_Tree *Tree) //递归方法后序遍历
{
if(Tree)
{
lastTraverse(Tree->lchild);
lastTraverse(Tree->rchild);
printf("%c ",Tree->data);
}
}
static int j=0;
void Create_quiettree(Binary_Tree *Tree,Treenode a[]) //将动态二叉树转换成静态二叉链表
{
a[j].data=Tree->data;
if(Tree->lchild==NULL)
a[j].lchild=0;
else
a[j].lchild=Tree->lchild->index;
if(Tree->rchild==NULL)
a[j].rchild=0;
else
a[j].rchild=Tree->rchild->index;
j++;
if(Tree->lchild!=NULL)
Create_quiettree(Tree->lchild,&a[0]);
if(Tree->rchild!=NULL)
Create_quiettree(Tree->rchild,&a[0]);
}
void main()
{
Binary_Tree *T;
Treenode a[N];
printf("请输入二叉树的节点数据,类型为字符型,当为空时用空格代替:");
T=Create_actiontree();
Create_quiettree(T,&a[0]);
printf("先序遍历:");
prioritiesTraverse(T);
printf("\n");
printf("中序遍历:");
middleTraverse(T);
printf("\n");
printf("后序遍历:");
lastTraverse(T);
printf("\n\n");
printf("说明:当左孩子或右孩子为空时,用0填充\n\n");
printf("静态二叉链表为:\n");
printf("i\tdata\tlchild\trchild\t\n");
int m;
for(m=0;m<i;m++)
{
printf("%d\t%c\t%d\t%d\n",m,a[m].data,a[m].lchild,a[m].rchild);
}
}
运行截图: