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

二叉树层序遍历(C语言)[通俗易懂]二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。如下:层序遍历结果:ABCDEFG基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。自然,本题还可以用数组来实现。代码:#include<stdio.h>#include<stdlib.h>#defineQueueMax100typedefstructNode{chardata;structNode*

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

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

如下:
在这里插入图片描述
层序遍历结果:
ABCDEFG

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

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

代码:

#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.net/143231.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!

    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!Unity,游戏。本文设计了一个第一人称射击游戏的Demo开发过程,文中对射击游戏的基础功能做了一个详细介绍,适用于一个基础框架,可以用于一个射击游戏的完整开发,请品尝。

    2022年4月27日
    31
  • ICMP报文分析

    ICMP报文分析

    2021年11月14日
    51
  • MyBatis Plus 实现多表分页查询

    MyBatis Plus 实现多表分页查询在MybatisPlus中,虽然IService<T>接口帮我们定义了很多常用的方法,但这些都是T对象有用,如果涉及到多表的查询,还是需要自定义Vo对象和自己编写sql语句,MybatisPlus提供了一个Page对象,查询是需要设置其中的size字段和current字段的值一、分页配置 可以直接使用selectPage这样的分页,但返回的数据确实…

    2022年5月1日
    147
  • python rarfile不支持中文路径_python使用zipfile解压文件中文乱码问题

    python rarfile不支持中文路径_python使用zipfile解压文件中文乱码问题中文在编程中真实后娘养的,各种坑爹,python3下中文乱码这个问题抓破了头皮,头疼。看了alex的文章,才有种恍然大悟的感觉(链接在底部)。一句话,就是转换成unicode,压缩前是什么编码,使用什么编码encode再decode回来先看测试代码:#-*-coding:utf-8-*-importzipfile#默认模式r,读azip=zipfile.ZipFile(“/Users…

    2022年10月22日
    1
  • 如何用eclipse创建一个java工程并运行[通俗易懂]

    如何用eclipse创建一个java工程并运行[通俗易懂]1.File–>New–>JavaProject。2.命名工程如:new1,然后点击Next。3.点击Finish4.点击don’tcreat5.右键scr–>New–>Package创建一个封包6.命名封包,注意封包命名只能使用小写字母,不能用大写字母,点击Finish7.右键封包名–>New–>Class8.输入名称,点击Finish9.输入如下代码,比如输入syso…

    2022年7月7日
    22
  • Android代码混淆及反编译

    Android代码混淆及反编译如果你目前还是一名学生或是没有在应用商店中上传过应用,恐怕对此的感受不深。而在企业中对Java代码的混淆却是一步很重要的步骤,从安全的角度来说,代码混淆,防止居心不良的人对代码进行恶意篡改非常重要。下面就是对Android项目进行的代码混淆和加密签名过程。

    2022年5月30日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号