C语言--二叉树的遍历_程序设计小屋_百度空间

#include <stdlib.h>
#include <stdio.h>
#define Maxsize 100
#define OK 1
#define OVERFLOW -2
typedef struct BinNode                        //定义二叉树结构
{
        char data;
        struct BinNode        *lchild,*rchild;
} BinNode, *BinTree;

int CreateBinTree(BinTree *Tree)
{
        char ch;
        scanf("%c",&ch);
        if(ch == '.')
                (*Tree) = NULL;
        else
        {
                if(!((*Tree) = (BinTree)malloc(sizeof(BinNode))))
                        exit(OVERFLOW);
                (*Tree)->data = ch;
                CreateBinTree(&((*Tree)->lchild));
                CreateBinTree(&((*Tree)->rchild));
        }
        return OK;
}//CreateBiTree

void Preorder (BinTree T)
{
        BinNode *stack[Maxsize],*p;
        int top;
        if(T)
        {
                top=1;             //根结点入栈
                stack[top]=T;
                while(top>0)
                {
                        p=stack[top]; //退栈并访问该结点
                        top--;
                        printf("%c",p->data);
                        if(p->rchild)   //右孩子入栈
                        {
                                top++;
                                stack[top]=p->rchild;
                        }
                        if(p->lchild)   //左孩子入栈
                        {
                                top++;
                                stack[top]=p->lchild;
                        }
                }
        }
}

void Inorder(BinTree T)
{
        BinNode *stack[Maxsize],*p;
        int top=0;
        p=T;
        do
        {
                while(p)             //扫描左结点
                {
                        top++;
                        stack[top]=p;
                        p=p->lchild;
                }
                if(top>0)
                {
                        p=stack[top];    //*p所指结点为无左子树的结点或其左子树已遍历过
                        top--;
                        printf("%c",p->data);
                        p=p->rchild;
                }
        }while(p || top!=0);
}
void Postorder(BinTree T)
{
        BinNode *stack[Maxsize],*p;
        int tag[Maxsize];
        int top=0;
        p=T;
        do
        {
                while(p)
                {
                        top++;
                        stack[top]=p;
                        tag[top]=0;
                        p=p->lchild;
                }
                if(top>0)
                {
                        if(tag[top]==1)
                        {
                                printf("%c",stack[top]->data);
                                top--;
                        }
                        else
                        {
                                p=stack[top];
                                if(top>0)
                                {
                                        p=p->rchild;
                                        tag[top]=1;
                                }
                        }
                }
        }while(p || top!=0);
}

void Translevel(BinTree T)
{
        struct Bin
        {
                BinTree R[Maxsize];
                int f,r;
        }q;
        q.f=0;
        q.r=0;
        if(T)
                printf("%c",T->data);
        q.R[q.r]=T;
        q.r=q.r+1;
        while(q.f<q.r)
        {
                T=q.R[q.f];
                q.f=q.f+1;
                if(T->lchild)
                {
                        printf("%c",T->lchild->data);
                        q.R[q.r]=T->lchild;
                        q.r=q.r+1;
                }
                if(T->rchild)
                {
                        printf("%c",T->rchild->data);
                        q.R[q.r]=T->rchild;
                        q.r=q.r+1;
                }
        }
}

void main()               
{
        BinTree T=NULL;
        printf("请输入您要建立的二叉树的先序扩展序列(用.表示空)\n");

        CreateBinTree(&T);
        printf("构造二叉树成功!\n");
    printf("先序遍历:");
    Preorder(T);
    printf("\n中序遍历:");
        Inorder(T);
        printf("\n后序遍历:");
        Postorder(T);
    printf("\n层次遍历:");
    Translevel(T);
    printf("\n");
}



郑重声明:资讯 【C语言--二叉树的遍历_程序设计小屋_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——