#include#include #include #define M 3#define MAX 300FILE*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 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] 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] 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 data); for(i=0;i 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 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("\n"); StackPreorder(t); off();}
版权声明:本文为博主原创文章,未经博主允许不得转载。