二叉树的遍历

来源:互联网 发布:夏天披肩款式图淘宝网 编辑:程序博客网 时间:2024/05/21 21:01
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100#define TElemType chartypedef struct BiTNode{    TElemType data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//链式存储,用于一般的二叉树//顺序栈typedef struct stack{    BiTree data[MAXSIZE];    int top;}stack;//链式队列typedef struct{    BiTree data;    struct LinkNode *next;}LinkNode;typedef struct{    LinkNode *front,*rear;}LinkQueue;//树的操作声明BiTree CreateBiTree(BiTree T);void PreOrder(BiTree T);//先序遍历void InOrder(BiTree T);//中序遍历void PostOrder(BiTree T);//后序遍历void PreOrder2(BiTree T);//非递归的先序遍历void InOrder2(BiTree T);//非递归的中序遍历void PostOrder2(BiTree T);//非递归的后序遍历void LevelOrder(BiTree T);//层次遍历//栈的操作声明void InitStack(stack *S);void Push(stack *S,BiTree T);BiTree Pop(stack *S);//队列的操作声明void InitQueue(LinkQueue *Q);void EnQueue(LinkQueue *Q,BiTree p);BiTree DeQueue(LinkQueue *Q);int main(){    BiTree T;    printf("请先序输入结点,空格表示空:\n");    T=CreateBiTree(T);    printf("先序输出结果为:");    PreOrder(T);printf("\n");    printf("先序非递归输出结果为:");    PreOrder2(T);printf("\n");    printf("中序递归输出结果为:");    InOrder(T);printf("\n");    printf("中序非递归输出结果为:");    InOrder2(T);printf("\n");    printf("后序输出结果为:");    PostOrder(T);printf("\n");    printf("后序非递归输出结果为:");    PostOrder2(T);printf("\n");    printf("层序输出结果为:");    LevelOrder(T);printf("\n");    return 0;}BiTree CreateBiTree(BiTree T){    char val=getchar();    if(val==' ')    {        T=NULL;    }    else    {        T=(BiTree)malloc(sizeof(BiTNode));        T->data=val;        T->lchild=CreateBiTree(T->lchild);        T->rchild=CreateBiTree(T->rchild);    }    return T;}void PreOrder(BiTree T){    if(T)    {        printf("%c ",T->data);        PreOrder(T->lchild);        PreOrder(T->rchild);    }}void InOrder(BiTree T){    if(T)    {        InOrder(T->lchild);        printf("%c ",T->data);        InOrder(T->rchild);    }}void PostOrder(BiTree T){    if(T)    {        PostOrder(T->lchild);        PostOrder(T->rchild);        printf("%c ",T->data);    }}void InitStack(stack *S){    S->top=-1;}void Push(stack *S,BiTree T){    if(S->top==MAXSIZE-1)    {        printf("栈满");    }    else    {        S->data[++S->top]=T;    }}BiTree Pop(stack *S){    BiTree p;    if(S->top==-1)    {        printf("栈空\n");    }    else    {        p=S->data[S->top];        S->top--;        return p;    }}void PreOrder2(BiTree T){    stack S;    InitStack(&S);    BiTree p=T;    while(p||S.top!=-1)    {        if(p)        {            Push(&S,p);            printf("%c ",p->data);            p=p->lchild;        }        else        {            p=Pop(&S);            p=p->rchild;        }    }}void InOrder2(BiTree T){    stack S;    InitStack(&S);    BiTree p=T;    while(p||S.top!=-1)    {        if(p)        {            Push(&S,p);            p=p->lchild;        }        else        {            p=Pop(&S);            printf("%c ",p->data);            p=p->rchild;        }    }}void PostOrder2(BiTree T){    stack S;    InitStack(&S);    int flag[MAXSIZE];    BiTree p=T,q;    while(p||S.top!=-1)    {        while(p)        {            Push(&S,p);            flag[S.top]=0;            p=p->lchild;        }        while(S.top!=-1&&flag[S.top]==1)        {            p=Pop(&S);            printf("%c ",p->data);            p=NULL;        }        if(S.top!=-1&&flag[S.top]!=1)        {            flag[S.top]=1;            q=S.data[S.top];            p=q->rchild;        }        else            break;    }}void InitQueue(LinkQueue *Q){    Q->front=Q->rear=(LinkNode*)malloc(sizeof(LinkNode));    Q->front->next=NULL;}void EnQueue(LinkQueue *Q,BiTree p){    LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));    s->data=p;    s->next=NULL;    Q->rear->next=s;    Q->rear=s;}BiTree DeQueue(LinkQueue *Q){    BiTree p;    LinkNode *q;    if(Q->front==Q->rear)    {        printf("队空\n");    }    else    {        q=Q->front->next;        p=q->data;        Q->front->next=q->next;        if(Q->rear==q)        {            Q->rear=Q->front;        }        free(q);    }    return p;}void LevelOrder(BiTree T){    LinkQueue Q;    InitQueue(&Q);    BiTree p;    EnQueue(&Q,T);    while(Q.front!=Q.rear)    {        p=DeQueue(&Q);        printf("%c ",p->data);        if(p->lchild!=NULL)        {            EnQueue(&Q,p->lchild);        }        if(p->rchild!=NULL)        {            EnQueue(&Q,p->rchild);        }    }}

运行结果:

这里写图片描述

原创粉丝点击