普通树的非递归遍历

来源:互联网 发布:java 哪里用到反射 编辑:程序博客网 时间:2024/05/16 05:10
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#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<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("\n");    StackPreorder(t);    off();}

0 0
原创粉丝点击