#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define M 3 #define MAX 300 FILE*rf; void open(){ rf=fopen("tree.txt","r"); } void off(){ fclose(rf); } void in(char *ch){ fscanf(rf,"%c",ch); } //以上为了输入方便,定义从文件输入一棵树 typedef struct node { char data; struct node*child[M]; }tnode,*tree; tree creat()//递归先序创建一棵树 { char ch;tree t; in(&ch); if(ch=='#')t=NULL; else { t=(tnode*)malloc(sizeof(tnode)); t->data=ch; int i; for(i=0;i<M;i++) t->child[i]=creat(); } return t; } void StackPreorder(tree t)//非递归前序遍历树 { tree stack[MAX]; int istack[MAX];//保存当前栈顶树访问到了那一颗子树 int top=0; while(top||t) { if(t) { printf("%c ",t->data); stack[top]=t;//该树入栈,保存 istack[top++]=1;//记录下一次应该是访问到第2棵树 t=t->child[0];//先访问第一棵子树 } else if(istack[top-1]<M)//访问它的下一个兄弟 t=stack[top-1]->child[istack[top-1]++]; else --top;//退栈 } } void StackPostorder(tree t)//非递归后序遍历树 { tree stack[MAX]; int istack[MAX],top=0; while(top||t) { if(t) { stack[top]=t; istack[top++]=1; t=t->child[0]; } else if(istack[top-1]<M)//继续下一个兄弟 t=stack[top-1]->child[istack[top-1]++]; else { printf("%c ",stack[--top]->data);//出栈 t=NULL;//访问置空 } } } void LevelOrder(tree t) { tree queue[MAX]; int front=0,rear=0,i; if(t)queue[rear++]=t; while(front<rear) { t=queue[front++];//输出队首信息,出队 printf("%c ",t->data); for(i=0;i<M;i++) if(t->child[i])//如果子树存在,入队 queue[rear++]=t->child[i]; } } int Equal(tree a,tree b) { if(!a&&!b)//都为空,则相等 return 1; if(a&&b) { if(a->data!=b->data)return 0;//数据不同,则树不同 int i; for(i=0;i<M;i++)//只要有一颗子树不同,则不同 if(!Equal(a->child[i],b->child[i])) return 0; return 1;//子树全同,相同 } return 0;//其他不同 } int main() { open(); //ABD#####C###E##F#GH###I##### tree t=creat(); LevelOrder(t); printf(" "); StackPreorder(t); off(); }
版权声明:本文为博主原创文章,未经博主允许不得转载。