二叉树的前序,中序,后序,BFS

#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;

typedef struct BiTNode{
    BiElemType data;
    BiTNode *lchild;
    BiTNode *rchild;
}BiTNode,*BiTree;

//辅助队列,用于辅助建树
typedef struct tag{
    BiTNode *p;//树某一个结点的地址值
    tag *pnext;
}tag_t,*ptag_t;

#define MaxSize 6
#define ElementType BiTree

typedef struct LinkNode{
    ElementType data;
    LinkNode *next;
}LinkNode,*LinkList;

typedef struct {
    LinkNode *front,*rear;//链表头,链表尾
}LinkQueue;

void InitQ(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode*) malloc(sizeof(LinkNode));
    Q.front->next=NULL;
}

void EnQueue(LinkQueue &Q,ElementType ele){
    LinkNode *NewNode=(LinkNode *)malloc(sizeof(LinkNode));
    NewNode->data=ele;
    Q.rear->next=NewNode;
    Q.rear=Q.rear->next;
    Q.rear->next=NULL;

}

void DeQueue(LinkQueue &Q,ElementType &DelEle){
    LinkNode *DelNode;

    //判断队列是否为空
    if(Q.front!=Q.rear){
        DelNode=Q.front->next;
        DelEle=DelNode->data;
        Q.front->next=DelNode->next;
        //链表只剩一个节点的时候使Q.rear=Q.front
        if(Q.rear==DelNode)
            Q.rear=Q.front;
        free(DelNode);
    }
    else{
        printf("the Queue is empty");
    }
}

bool isEmpty(LinkQueue Q){
    if(Q.front==Q.rear){
        return true;
    }
    else
        return false;
}

//建树abcdefghij
void BuildTag(BiTree root,ptag_t &Q){
    Q=(ptag_t) malloc(sizeof(tag));
    Q->p=root;
    Q->pnext=NULL;
    ptag_t newNode;
    ptag_t rear=Q;
    int ele=65;//a的码值
    for (int cnt = 0; cnt < 10; ++cnt) {
        newNode=(ptag_t) malloc(sizeof (tag));
        //申请空间,并初始化为0
        newNode->p=(BiTNode*) calloc(1,sizeof (BiTNode));
        newNode->p->data=ele;
        ele++;
        rear->pnext=newNode;
        newNode->pnext=NULL;
        rear=rear->pnext;
    }
}

void BuildTree(BiTree &root,ptag_t &Q){
    //cur为当前要创建左右子树的节点
    tag* cur=Q->pnext;
    //ptr指向将要插入到父节点的子节点
    tag* ptr=Q->pnext->pnext;
    root=cur->p;
    BiTree curBiNode=root;
    while(ptr){
        //如果当前父亲节点的左边孩子为空,那么向左边插入
        if(NULL==cur->p->lchild){
            curBiNode->lchild=ptr->p;
            ptr=ptr->pnext;
        }//左边孩子不为空那么向右边孩子插入
        else if(NULL==cur->p->rchild){
            curBiNode->rchild=ptr->p;
            ptr=ptr->pnext;
        }
            //都已满那么进行下一个父亲节点左右孩子的创建
        else{
            cur=cur->pnext;
            curBiNode=cur->p;
        }
    }
}

void PreOrder(BiTree biTree){
    if(biTree){
        printf("%c",biTree->data);
        PreOrder(biTree->lchild);
        PreOrder(biTree->rchild);
    }
}

void InOrder(BiTree biTree){
    if(biTree){
        InOrder(biTree->lchild);
        printf("%c",biTree->data);
        InOrder(biTree->rchild);
    }
}

void PostOrder(BiTree biTree){
    if(biTree){
        PostOrder(biTree->lchild);
        PostOrder(biTree->rchild);
        printf("%c",biTree->data);
    }
}

void BFS(BiTree biTree){
    LinkQueue Q;
    InitQ(Q);
    BiTNode *p=biTree;
    //树根入队
    EnQueue(Q,biTree);
    ElementType delEle;
    while (!isEmpty(Q)){
        p=Q.front->next->data;
        DeQueue(Q,delEle);
        printf("%c",delEle->data);
        if(p->lchild){
            EnQueue(Q,p->lchild);
        }
        if(p->rchild){
            EnQueue(Q,p->rchild);
        }

    }

}
int main() {
    BiTree root;
    ptag_t Q;
    BuildTag(root,Q);
    BuildTree(root,Q);

    InOrder(root);
    printf("\nbfs:\n");
    BFS(root);

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值