普通树的递归遍历

#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();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Thereisnospon/p/4768470.html