zoukankan      html  css  js  c++  java
  • 二叉树的前中后序遍历

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define Size 100
    #define Resize 10 
    typedef struct Bitnode{    //定义结点  
        char data;
        struct Bitnode *lchild,*rchild;
    }Bitnode,*Bitree;
    
    typedef struct Stack{            //定义栈
        Bitree *base;
        int top;
        int stacksize;
    }Stack;
    
    void Initstack(Stack &S)              //建栈
    {
        S.base=(Bitree*)malloc(Size*sizeof(Bitnode));
        if(!S.base)    return;
        S.top=0;
        S.stacksize=Size;
    }
    
    void Pushstack(Stack &S,Bitree e)                //入栈
    {
        if(S.top==S.stacksize)
        {
            S.base=(Bitree*)realloc(S.base,(S.stacksize+Resize)*sizeof(Bitnode));
            if(!S.base)    return;
            S.stacksize+=Resize;
        }
        S.base[S.top++]=e;
    }
    
    Bitree Pop(Stack &S,Bitree &e)          //出栈
    {
        if(S.top==0)
            return 0;
        e=S.base[--S.top];
        return e;
    }
    
    int Emptystack(Stack &S)        //栈的判空操作
    {
            if(S.top==0)
                return 1;
            return 0;
    }
    
    Bitree Gettop(Stack &S,Bitree &e)          //取栈顶元素
    {
        if(S.top==0)
            return 0;
        e=S.base[S.top-1];
        return e;    
    }
    
    void Createbitree(Bitree &bt)
    {
        //建立二叉树的二叉链表
        char ch;
        ch=getchar();
        if(ch=='#')
            bt=NULL;
        else
        {
            bt=(Bitree)malloc(sizeof(Bitnode));
            bt->data=ch;
            bt->lchild=bt->rchild=NULL;
            Createbitree(bt->lchild);
            Createbitree(bt->rchild);    
        } 
    }
    
    void Pretraverse(Bitree bt)
    {//递归先序遍历 
        if(bt)
        {
            printf("%c ",bt->data);
            Pretraverse(bt->lchild);
            Pretraverse(bt->rchild);
        }
    }
    
    void Preordertraverse(Bitree bt)
    {//非递归先序遍历 
        Stack S;
        Bitree p;
        if(bt) 
        {
            Initstack(S);Pushstack(S,bt);
            while(!Emptystack(S))
            {
                while(Gettop(S,p)&&p)
                {
                    printf("%c ",p->data);
                    Pushstack(S,p->lchild);
                }
                Pop(S,p);
                if(!Emptystack(S))
                {
                    Pop(S,p);
                    Pushstack(S,p->rchild);
                }
            }
        }
    }
    
    void Intraverse(Bitree bt)
    {//递归中序遍历 
        if(bt)
        {
            Intraverse(bt->lchild);
            printf("%c ",bt->data);
            Intraverse(bt->rchild); 
        }
    }
    
    void Inordertraverse(Bitree bt)
    {//非递归中序遍历 
        Stack S;
        Bitree p;
        if(bt)
        {
            Initstack(S); Pushstack(S,bt);
            while(!Emptystack(S))
            {
                while(Gettop(S,p)&&p)
                    Pushstack(S,p->lchild);
                Pop(S,p);
                if(!Emptystack(S))
                {
                    Pop(S,p);
                    printf("%c ",p->data);
                    Pushstack(S,p->rchild);
                }
            }
        }
    }
    
    void Posttraverse(Bitree bt)
    {//递归后序遍历 
        if(bt)
        {
            Posttraverse(bt->lchild);
            Posttraverse(bt->rchild);
            printf("%c ",bt->data);
        }
    }
    
    void Postordertraverse(Bitree bt)
    {//非递归后序遍历 
        Bitree p,q;
        Stack S;
        if(bt)
        {
            Initstack(S); Pushstack(S,bt);
            while(!Emptystack(S))
            {
                while(Gettop(S,p)&&p)
                    Pushstack(S,p->lchild);
                Pop(S,p);
                if(!Emptystack(S))
                {
                    Gettop(S,p);
                    if(p->rchild)
                        Pushstack(S,p->rchild);    
                    else
                    {
                        Pop(S,p);
                        printf("%c ",p->data);
                        while(!Emptystack(S)&&Gettop(S,q)&&q->rchild==p)
                        {
                            Pop(S,p);
                            printf("%c ",p->data);
                        }
                        if(!Emptystack(S))
                        {
                            Gettop(S,p);
                            Pushstack(S,p->rchild); 
                        }
                    } 
                }
            }
        }
    }
    int main()
    {
        Bitree bt;
        Createbitree(bt);
        printf("递归先序遍历二叉树:
    ");
        Pretraverse(bt);
        printf("
    ");
        printf("非递归先序遍历二叉树:
    ");
        Preordertraverse(bt);
        printf("
    ");
        printf("递归中序遍历二叉树:
    "); 
        Intraverse(bt);
        printf("
    ");
        printf("非递归中序遍历二叉树:
    ");
        Inordertraverse(bt);
        printf("
    ");
        printf("递归后序遍历二叉树:
    ");
        Posttraverse(bt);
        printf("
    ");
        printf("非递归后序遍历二叉树:
    ");
        Postordertraverse(bt);
        printf("
    ");
        return 0;
    }
    
    //ABD###CE##F##
  • 相关阅读:
    视图
    触发器
    DNS
    DHCP
    SSH 详解
    apt-get
    java split
    数组指针 指针数组
    函数指针
    网络协议
  • 原文地址:https://www.cnblogs.com/linxiaojie517/p/7771426.html
Copyright © 2011-2022 走看看