#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]==' ')//字符串结束 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(" "); } void Postorder(tree*t) { printf("树的后序遍历:"); postorder(t,t->root); printf(" "); } void Preorder(tree*t) { printf("树的前序遍历: "); preorder(t,t->root); printf(" "); } 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(" %d",t->tnode[i].child[j]); printf(" "); } } int main() { tree t,*pt=&t; BrackToTree(pt,str); show(pt); Preorder(pt); Postorder(pt); Levelorder(pt); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。