二叉树的层序(层次)遍历、广度优先

本文介绍了如何使用C语言实现二叉树数据结构,包括定义节点类型、创建队列操作函数以及层序遍历(广度优先遍历)算法。主要涉及了队列的初始化、元素的插入和删除,以及二叉树的层次遍历过程。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>

typedef char BiElemType;
typedef struct BiTNode {
    BiElemType data;
    struct BiTNode *lChild;
    struct BiTNode *rChild;//左右节点
} BiTNode, *BiTree;
//辅助队列
typedef struct tag {
    BiTree p;//树的某一个节点,指针类型,保存申请节点的指针
    struct tag *pnext;
} tag_t, *ptag_t;


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


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

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

bool enQueue(LinkQueue &q, BiTree num) {
    LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode));
    p->data = num;
    p->next = NULL;
    q.rear->next = p;//尾指针的next指向p,从尾部入队
    q.rear = p;//rear指向新的尾部
    return true;
}

bool deleteQueue(LinkQueue &q, BiTree &e) {
    if (q.front == q.rear) {
        return false;
    }
    LinkNode *pc = q.front->next;//拿到被删节点
    q.front->next = pc->next;
    e = pc->data;
    free(pc);
    if (q.rear == pc) {
        q.rear = q.front;
    }
    return true;
}


//层序遍历、广度优先遍历
void levelOrder(BiTree t) {
    LinkQueue q;
    initQueue(q);//初始化队列
    BiTree p;//存储出队节点
    enQueue(q, t);//根节点入队
    while(!isEmpty(q)){
        deleteQueue(q,p);
        putchar(p->data);
        if(p->lChild){
            enQueue(q, p->lChild);
        }
        if(p->rChild){
            enQueue(q, p->rChild);
        }
    }
}

int main() {
    BiTree p;//指向新申请的树节点
    BiTree tree = NULL;//初始化根节点
    //队头,队尾,新节点,新节点父元素
    ptag_t phead = NULL, ptail = NULL, listpnew = NULL, pucr = NULL;
    char c;
    while (scanf("%c", &c)) {
        if (c == '\n') {
            break;;
        }
        p = (BiTree) calloc(1, sizeof(BiTNode));
        p->data = c;
        listpnew = (ptag_t) calloc(1, sizeof(tag_t));//给队列节点申请空间
        listpnew->p = p;
        if (tree == NULL) {
            tree = p;
            //第一个节点既是队列头也是队列尾
            phead = listpnew;
            ptail = listpnew;
            pucr = listpnew;
        } else {
            ptail->pnext = listpnew;
            ptail = listpnew;
            //将数放入左孩子
            if (pucr->p->lChild == NULL) {
                pucr->p->lChild = p;
            } else if (pucr->p->rChild == NULL) {
                pucr->p->rChild = p;
                pucr = pucr->pnext;
            }
        }
    }
    //层序遍历、广度优先遍历
    levelOrder(tree);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值