二叉树的层序遍历

原创 2016年06月01日 14:40:38

题目:从上往下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
考察点:二叉树的层序遍历;
算法思想:每一次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直至队列中所有的节点都被打印出来为止。

实现方法:借助STL中的deque来实现,具体实现如下。

#include <iostream>
using namespace std;
#include <deque>


typedef struct node
{
    char data;
    struct node *lchild;
    struct node *rchild;
}BiNode, *BiTree;


// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)
BiTree createBiTree()
{
    BiTree T;

    char c;
    scanf("%c", &c);

    if (c == '#')
        T = NULL;
    else
    {
        T = new BiNode;  // 或 T = (BiTree)malloc(sizeof(BiNode));
        T->data = c;

        T->lchild = createBiTree();
        T->rchild = createBiTree();
    }

    return T;

}


// 层序遍历二叉树
void LevelOrderTraverse(BiTree T)
{
    if (T == NULL) return;

    deque<BiTree> q;
    q.push_back(T);

    while (q.size()) // 或 while (!q.empty())
    {
        BiTree p = q.front(); // 取出当前的队首元素,并赋值给p

        q.pop_front(); // 队首元素出队
        printf("%c ", p->data); // 打印队首元素

        if (p->lchild) // 若该队首元素有左孩子节点,那么让左孩子节点入队;
            q.push_back(p->lchild);

        if (p->rchild) // 若该队首元素有右孩子节点,那么让右孩子节点入队;
            q.push_back(p->rchild);

    }

}


int main(int argc, const char * argv[]) {

    BiTree T = createBiTree(); // 建立
    LevelOrderTraverse(T); // 层序遍历

    return 0;
}

知识点补充:
(1)使用deque容器之前必须加上<deque>头文件:#include<deuqe>;
(2)deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std;
(3)构造函数
<1> deque<Elem> c 创建一个空的deque
<2> deque<Elem> c1(c2) 复制一个deque。
<3> deque<Elem> c(n) 创建一个deque,含有n个数据,数据均已缺省构造产生。
(4)成员函数
<1> c.empty()判断c容器是否为空
<2> c.front()返回c容器的第一个元素
<3> c.back()返回c容器的最后一个元素
<4> c.size()返回c容器中实际拥有的元素个数
<5> c.push_back(num)在末尾位置插入元素
<6> c.pop_back()删除末尾位置的元素
<7> c.push_front(num)在开头位置插入元素
<8> c.pop_front()删除开头位置的元素
Deque 容器的参考资料:STL之deque容器详解

版权声明:本文为博主原创文章,未经博主允许不得转载。

二叉树的层序遍历

二叉树的层序遍历就是按照二叉树的深度分层遍历,也就是广度优先遍历(BFS)。层序遍历使用队列,一种先进先出(FIFO)的数据结构。下面简单介绍下二叉树 的层序遍历。 层序遍历从根节点开始,将根节点压...
  • u012877472
  • u012877472
  • 2015年10月27日 17:13
  • 3703

层序遍历二叉树(不借助vector或deque,用C语言实现)

前面几篇文章中,我们对二叉树的层序遍历和层序打印都是借助vector或deque来实现的,本文只通过C语言来实现,代码如下:#include using namespace std; #define...
  • cyuyanenen
  • cyuyanenen
  • 2016年06月02日 19:36
  • 1672

二叉树的层序遍历

我的主力博客:半亩方塘 层序遍历二叉树需要用到队列的先进先出的特性,这里的二叉树采用二叉链接表示法,队列是采用顺序存储结构的循环队列,按照前序遍历建立二叉树,利用队列层序遍历二叉树的主要过程如下: ...
  • gcvdsvb
  • gcvdsvb
  • 2015年12月04日 19:28
  • 922

C语言二叉树的层序遍历

在上一篇中我记录了二叉树的先序,中序,后序的递归和非递归遍历方法,这一篇会接着上一篇的,记录二叉树的层序遍历方法,层序遍历用到了队列的数据结构,下面直接上代码: 1、首先是链队列的数据结构定义,Lin...
  • yubo_725
  • yubo_725
  • 2015年11月22日 15:41
  • 4105

数据结构实验之二叉树五:层序遍历

数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript...
  • zhao19961027
  • zhao19961027
  • 2016年11月03日 20:50
  • 2316

二叉树的层序遍历详细讲解(附完整C++程序)

1 说明   二叉树的层序遍历是面试经常会被考察的知识点,甚至要求当场写出实现过程。笔者先后被腾讯和滴滴面试官问过这个问题,腾讯面试官是让称述整个实现过程,本人自信满满的说出来了,所以也没有对具体实现...
  • FX677588
  • FX677588
  • 2017年07月03日 22:23
  • 3216

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.cs...
  • why850901938
  • why850901938
  • 2016年04月04日 02:56
  • 6146

【数据结构与算法】二叉树的层序遍历

转载请注明出处: http://blog.csdn.net/ns_code/article/details/13169703     前面有篇博客详细分析了二叉树三种遍历(前序、中序...
  • zhangxiao93
  • zhangxiao93
  • 2016年03月12日 11:08
  • 3823

二叉树层序遍历(队列)

这念头学艺不精就要被人鄙视,自国外某知名软件公司面试完后,发现学过的全忘脑后了。对着面试官只能“说不知道”,“不好意思,想不起来了”。一点印象都没了,想憋都憋不出来啊。。。    一个简单的层次遍历,...
  • nexttake
  • nexttake
  • 2013年08月14日 14:55
  • 1776

二叉树的几种遍历方式浅析:递归遍历/堆栈遍历/层序遍历/Morris遍历

递归和堆栈来实现二叉树的遍历
  • lavorange
  • lavorange
  • 2014年08月25日 16:01
  • 1982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的层序遍历
举报原因:
原因补充:

(最多只允许输入30个字)