遍历二叉树————非递归后续遍历

来源:互联网 发布:舟山沈四小网络考试 编辑:程序博客网 时间:2024/06/07 17:59
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 1000
typedefchar datatype;
typedefstruct Node
{
    datatype data;
    structNode *lchild;
    structNode *rchild;
}BiTNode, *BiTree;
 
typedefstruct
{
    BiTree da[1000];
    inttop;
}SeqStack;
 
typedefstruct
{
    BiTree da[max];
    intfront;
    intrear;
}SeqQueue;
 
SeqQueue *InitQueue()
{
    SeqQueue *q;
    q = (SeqQueue *)malloc(sizeof(SeqQueue));
    q->front = q->rear = max-1;
    returnq;
}
 
intIsEmpty(SeqQueue *q)
{
    if(q->front == q->rear)
    return1;
    else
    return0;
}
 
voidEnterQueue(SeqQueue *q,BiTree root)
{
    BiTree p;
    p = root;
    if((q->rear+1) % max == q->front) {
        return;
    }
    else{
        q -> rear = (q->rear+1) % max;
        q->da[q->rear] = p;
    }
}
 
voidout(SeqQueue *q, BiTree *root)
{
    if(q->front == q->rear)
    return;
    else{
        q->front = (q->front+1)%max;
        *root = q->da[q->front];
    }
}
 
voidcreat(BiTree *root)
{
    charch;
    ch = getchar();
    if(ch == '#') {
        *root = NULL;
    }
    else{
        *root = (BiTree)malloc(sizeof(BiTNode));
        (*root)->data = ch;
        creat(&(*root)->lchild);
        creat(&(*root)->rchild);
    }
}
 
voidcengci(BiTree root)
{
    SeqQueue *s;
    BiTree p;
    s=InitQueue();
    EnterQueue(s,root);
    while(!IsEmpty(s)) {
        out(s,&p);
        printf("%c",p->data);
        if(p->lchild != NULL)
        EnterQueue(s,p->lchild);
        if(p->rchild != NULL)
        EnterQueue(s,p->rchild);
    }
    printf("\n");
}
 
//BIAOJI
voidgetTop(SeqStack *s, BiTree *p)
{
    if(Empty(s))
    return;
    else
    *p = s->da[s->top];
}
voidpush(SeqStack *s, BiTree root)
{
    BiTree p;
    p = root;
    if(s->top == 999)
        return;
    else{
        s->top++;
        s->da[s->top]=p;
    }
}
SeqStack  *InitStack()
{
    SeqStack *s;
    s=(SeqStack *)malloc(sizeof(SeqStack));
    s->top = -1;
    returns;
}
intEmpty(SeqStack *s)
{
    if(s->top == -1)
    return1;
    else
    return0;
}
voidpop(SeqStack *s, BiTree *root)
{
    BiTree p;
    p = *root;
    if(Empty(s))
        return;
    else{
        *root = s-> da[s->top];
        s->top--;
    }
}
voidPostOrder(BiTree root)
{
    SeqStack *s;
    BiTree p,q;
    s=InitStack();
    p = root;
    q = NULL;
    while(p != NULL || !Empty(s)) {
        while(p != NULL) {
            push(s,p);
            p = p -> lchild;
        }
        if(!Empty(s)) {
            getTop(s,&p);
            if(p->rchild==NULL || p->rchild == q) {
                 pop(s,&p);
                 printf("%c",p->data);
                 q=p;
                 p=NULL;
            }
            else
                p = p -> rchild;
        }
    }
}
intmain()
{
    BiTree root;
    creat(&root);
 //   cengci(root);
    PostOrder(root);
    return0;
}
0 0