前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >二叉树层序遍历(C语言)[通俗易懂]

二叉树层序遍历(C语言)[通俗易懂]

作者头像
全栈程序员站长
发布2022-08-31 15:38:20
1.5K0
发布2022-08-31 15:38:20
举报

大家好,又见面了,我是你们的朋友全栈君。

二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。

如下:

在这里插入图片描述
在这里插入图片描述

层序遍历结果: ABCDEFG

基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。

自然,本题还可以用数组来实现。

代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#define QueueMax 100

typedef struct Node
{ 
   
    char data;
    struct Node *LChild, *RChild;
}BiNode, *BiTree;

typedef struct
{ 
   
    BiTree data[QueueMax];
    int head;
    int rear;
    int len;
}Queue;

BiTree CreateTree();  //建立二叉树
Queue InitQueue();  //初始化队列
int IsEmptyQueue(Queue seq);  //队列判空
int IsFullQueue(Queue seq);   //队列判满
void PushQueue(Queue *seq, BiTree T);  //入队
void PopQueue(Queue *seq, BiTree *T);  //出队
void LayerOrder(BiTree T);  //层序遍历

int main()
{ 
   
    BiTree T;
    T = CreateTree();
    LayerOrder(T);
    return 0;
}

BiTree CreateTree()
{ 
     //建立二叉树
    char c;
    c = getchar();
    BiTree T;
    if (c == '#') { 
   
        return NULL;
    }
    T = (BiTree) malloc (sizeof(BiNode));
    T->data = c;
    T->LChild = CreateTree();
    T->RChild = CreateTree();
    return T;
}

Queue InitQueue()
{ 
     //初始化队列
    Queue seq;
    for(int i = 0; i < QueueMax; i++) { 
   
        seq.data[i] = NULL;
    }
    seq.head = 0;
    seq.rear = -1;
    seq.len = 0;
    return seq;
}

int IsEmptyQueue(Queue seq)
{ 
     //队列判空
    if (seq.len == 0) { 
   
        return 1;
    }
    return 0;
}

int IsFullQueue(Queue seq)
{ 
     //队列判满
    if (seq.len == QueueMax) { 
   
        return 1;
    }
    return 0;
}

void PushQueue(Queue *seq, BiTree T)
{ 
     //入队
    if (IsFullQueue(*seq)) { 
   
        printf("ErrorFull");
        return;
    }
    seq->rear = (seq->rear + 1) % QueueMax;
    seq->len++;
    seq->data[seq->rear] = T;
}

void PopQueue(Queue *seq, BiTree *T)
{ 
     //出队
    if (IsEmptyQueue(*seq)) { 
   
        printf("ErrorEmpty");
        return;
    }
    seq->head = (seq->head + 1) % QueueMax;
    *T = seq->data[seq->head];
    seq->len--;
}

void LayerOrder(BiTree T)
{ 
     //层序遍历
    Queue seq;
    seq = InitQueue();
    BiTree tmp;
    tmp = T;
    PushQueue(&seq, tmp);
    while(!IsEmptyQueue(seq)) { 
   
        printf("%c", tmp->data);
        if (tmp->LChild != NULL) { 
   
            PushQueue(&seq, tmp->LChild);
        }
        if (tmp->RChild != NULL) { 
   
            PushQueue(&seq, tmp->RChild);
        }
        PopQueue(&seq, &tmp);
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143231.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档