zoukankan      html  css  js  c++  java
  • 普通树的递归遍历

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

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

  • 相关阅读:
    机器学习(十七)— SVD奇异值分解
    机器学习(十五)— Apriori算法、FP Growth算法
    机器学习(十四)— kMeans算法
    深度学习—反卷积的理解
    【ECMAScript5】ECMAScript5中有关数组的常用方法
    【window】window10永久关闭更新
    【js】使用javascript 实现静态网页分页效果
    【vue】钩子函数生命周期
    【vue】vue中ref用法
    【vue-waring】element UI 由版本1.4.12 升级到element-ui@2.0.10
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768470.html
Copyright © 2011-2022 走看看