我用的是人民邮电出版社的数据结构。看到本书对树的介绍,感觉晕晕的,他怎么就不按套路出牌了呢?前面几章都是按套路来,这个刚开始就告诉我一万种表示方法,有神马用。 首先是双亲表示法,书中就是带过,个人感觉作用没多大,哪有人用线性表表示树的,连接起来不得麻烦死。这里不想写它的代码,没用。接下来介绍了孩子表示法,从书后面的实验中感觉孩子表示法中的指针表示法是主流的树的表示方法。这里先介绍孩子表示法的指针表示。书中给的代码是这样的:
#define m 3
typedef struct node
{
int data;
struct node *child[m];
}node ,*tree;
这里有不明白的,首先是那个node *child[],我记得链表之中有一个node *next这个是用来链接下接下来的链表的。这个感觉跟那个没什么太大的区别,链表的后面只能链接一个,而用node *child [m]之后,他后面就可以链接m个了(child[0]一个,child[1]一个....)。接下来是这个,*tree是什么鬼?看了书中后面的代码,了解到,*tree等价于typedef node *tree ,意思就是struct node可以用node来表示,以可以用* tree来表示。他们两个的区别,举个例子,都来定义stl 。一个是node *stl 另一个是 tree stl差别就是这个。
接下来写一个带有主函数的代码(我也不知道为什么树全都是二叉树,可能是学了图就会了其他的树了吧,学图的时候回来再看):
用的书上的例子:
代码是:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node *child[100];
} node,*tree;
tree creat()//前序输入
{
tree a=(tree)malloc(sizeof(node));
scanf("%c",&a->data);
if(a->data!='#')
for(int i=0; i<3; i++)
a->child[i]=creat();
else
a=NULL;
return a;
}
void preorder(tree a)//前序输出
{
if(a!=NULL)
{
printf("%c",a->data);
for(int i=0; i<3; i++)
preorder(a->child[i]);
}
}
void levelorder(tree a)//层次输出
{
tree list[100];
int s=0,e=1;
list[0]=a;
if(list[0]!=NULL)
{
while(s<e)
{
printf("%c",list[s]->data);
for(int i=0; i<3; i++)
{
if(list[s]->child[i]!=NULL)
{
list[e]=list[s]->child[i];
e++;
}
}
s++;
}
}
}
void postorder(tree a)//后序输出
{
if(a!=NULL)
{
for(int i=0; i<3; i++)
postorder(a->child[i]);
printf("%c",a->data);
}
}
int main()
{
tree a;
a=creat();
preorder(a);
printf("\n");
postorder(a);
printf("\n");
levelorder(a);
return 0;
}
输入的测试数据是前序的:ab###ce###fh###i####g###d###(注意i后面是4个#不是三个!!!!)