#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define M 3
#define MAX 200
typedef char type;
typedef struct node//树节点
{
type data;
int child[M];//孩子节点的位置信息
}treenode;
typedef struct//树
{
treenode tnode[MAX];
int root;//根节点位置信息
int length;//树的节点个数
}tree;
char str[MAX]="1(2.3(4.5))";//数的括号表示的字符串
void BrackToTree(tree *t,char s[])
{
int stack[MAX];
int ti=0,si=0,done=1,top=0,i,parent;
t->tnode[ti].data=s[si++];t->root=0;//根节点保存在0处
for(i=0;i<M;i++)//根节点子节点位置初始化
t->tnode[ti].child[i]=-1;
while(done)//还没有结束
{
if(s[si]=='(')//如果是左括号,说明进入了当前树的子节点中,将该节点的位置保存在栈中
stack[top++]=ti;
else if(s[si]==')')//如果是右括号,说明当前树的子节点结束,将当前树退栈
{
top--;
if(top==0)//如果栈已空,说明处理完毕
done=0;
}
else if(s[si]=='.')//如果是'.'跳过
;
else if(s[si]=='\0')//字符串结束
done=0;
else
{
ti++;//向数中添加一颗树,树位置ti加一
t->tnode[ti].data=s[si];
for(i=0;i<M;i++)//将新增的树的子节点初始化
t->tnode[ti].child[i]=-1;
parent=stack[top-1];//得到栈顶元素的位置信息,即该树的双亲位置
i=0;
while(t->tnode[parent].child[i]!=-1)//再改树的双亲中寻找适当位置
i++;
t->tnode[parent].child[i]=ti;//将当前树插入到双亲的相应位置中
}
si++;//继续访问括号字符串的下一个字符
}
t->length=ti+1;//修改树的节点个数
}
void preorder(tree *t,int pos)//数的前序遍历
{
if(t&&pos<t->length)
{
int i;
printf("%c ",t->tnode[pos].data);
for(i=0;i<M;i++)
if(t->tnode[pos].child[i]!=-1)
preorder(t,t->tnode[pos].child[i]);
}
}
void postorder(tree *t,int pos)//树的后序遍历
{
if(t&&pos<t->length)
{
int i;
for(i=0;i<M;i++)
if(t->tnode[pos].child[i]!=-1)
postorder(t,t->tnode[pos].child[i]);
printf("%c ",t->tnode[pos].data);
}
}
void Levelorder(tree*t)//树的层次遍历
{
printf("树的层次遍历: ");
int queue[MAX],front=0,rear=0;
if(t->root!=-1)
queue[rear++]=t->root;
while(front<rear)
{
int pos=queue[front++],i;
printf("%c ",t->tnode[pos].data);
for(i=0;i<M;i++)
if(t->tnode[pos].child[i]!=-1)
queue[rear++]=t->tnode[pos].child[i];
}
printf("\n");
}
void Postorder(tree*t)
{
printf("树的后序遍历:");
postorder(t,t->root);
printf("\n");
}
void Preorder(tree*t)
{
printf("树的前序遍历: ");
preorder(t,t->root);
printf("\n");
}
void show(tree *t)//显示保存树节点数组中的所有信息
{
int i,j;
for(i=0;i<t->length;i++)
{
printf("%c ",t->tnode[i].data);
for(j=0;j<M;j++)
printf("\t%d",t->tnode[i].child[j]);
printf("\n");
}
}
int main()
{
tree t,*pt=&t;
BrackToTree(pt,str);
show(pt);
Preorder(pt);
Postorder(pt);
Levelorder(pt);
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。