二叉树的层序遍历

原创 2018年04月16日 23:43:54

 之前写过二叉树的先序、中序、后序遍历,今天给大家介绍一下二叉树的层序遍历。二叉树的层序遍历

 

层序遍历也很好理解,一层一层的将你的二叉树遍历后输出。根据这个图输出顺序也就是125346.

 上一篇文章也说了,二叉树的操作大多是通过递归来实现的,如果还按你以前的顺序你会遍历1,2,3,4这样下去,但是你现在又不能输出,那要怎么办?最早我的想法是用一个栈存起来,我让二叉树后序遍历,然后将这些遍历过得顺序放到一个栈中,所以最底层先进去,然后依次往回退,但是这个方法仔细想想是不可以的,最起码到了你的右子树就不正确了。

  这里要怎么实现,通过一个队列来实现,思想就是首先将你的root结点,进入队列,然后当你从队列出元素的时候如果他有左孩子或者右孩子的话就将他的左右孩子进入队列, 一直循环下去就可以实现二叉树的层序遍历。

 

看上图,首先让1进来,当前队列不为空那就从队列出元素,1这时候1输出,1出的同时判断他的左右孩子是不是为空,不为空,两个都进队列,此时队列不为空,出队头元素2,出2的同时让2的左右孩子不为空的进入对列,之前1的右孩子5比2的左右孩子先进入队列所以现在出队列是出5,依次下去就能实现二叉树的层序遍历。

  这里在创建队列的时候有一些需要注意的地方,无论你是用的链表还是数组都要注意一个小问题,这里用来存储数据的结构类型都应该是你的二叉树的类型,当然不注意这个问题你是编译不过去的。

typedef struct Queue

{

BTNode*  data[maxsize];

BTDataType front;//队头指针

BTDataType fail;//队尾指针

}Queue;

这是我的队列的结构体。数据类型要用BTNode*类型的。

void BTreeLevelOrder(BTNode* root)

{

if (root == NULL)

return;

Queue* BTree=NULL;

BTNode* Bt;

BTree = CreateQueue();

Queuepush(BTree, root);

while (Queuesize(BTree)> 0)

{

Bt = QueuePop(BTree);

printf("%d", Bt->_data);

if (Bt->_left!=NULL)

Queuepush(BTree, Bt->_left);

if (Bt->_right != NULL)

Queuepush(BTree, Bt->_right);

 

}

}

这里就不能再用递归的思想了,这里需要用while循环控制你循环的条件就是你队列条件如果是空的话,那就说明已经没有再进入队列的元素,代码并不难需要的是思想和细节,我的程序到现在还有一些小问题,不过编译调试了几次之后认为问题不在层序遍历这个函数,应该是自己对队列的一些操作的问题,还是得再仔细的调试几遍找到问题,感觉写代码提升的是你对程序,对语言的运用,锻炼的是编写程序的思想,但是调试才是对你编码能力的提升。自己还是需要把自己写的每个程序都仔仔细细跑一遍,找出每一个小问题。

  

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/79968615

二叉树的层序遍历(递归)

输出二叉树的层序遍历序列 如[2,6,8,null,null,10,12],输出[[2],[6,8],[10,12]] Binary Tree Level Order Traversal 借助v...
  • Tao_Ba
  • Tao_Ba
  • 2016-11-08 22:44:25
  • 1234

二叉树层序遍历-实现代码-队列

  • 2012年12月02日 17:57
  • 3KB
  • 下载

二叉树系列--层序遍历(java实现)

记录两道题目: 第一题:计算二叉树的深度,两行递归即可搞定。 public static int level(Node root) { if (root == null) return ...
  • gotobar
  • gotobar
  • 2015-09-19 19:52:02
  • 973

C语言二叉树的层序遍历

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

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

前面有篇博客详细分析了二叉树三种遍历(前序、中序、后序)方式的递归与非递归实现,参见:http://blog.csdn.net/ns_code/article/details/12977901,但把二...
  • mmc_maodun
  • mmc_maodun
  • 2013-10-27 14:51:06
  • 22663

二叉树层序遍历(队列)

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

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

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

二叉树层序遍历的c++写法

void LevelOrder(struct node *root)//运用队列(注意头文件引用) {     queueq;     struct node *p = root;     if(p)...
  • shadowam
  • shadowam
  • 2017-02-21 15:10:00
  • 706

二叉树的层序遍历(递归和非递归)

二叉树的定义 typedef struct node{ struct node *left, *right; int val; }Node, *BinTree; 非递归实现二叉树的层...
  • laobai1015
  • laobai1015
  • 2017-04-07 13:28:35
  • 704

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

1 说明   二叉树的层序遍历是面试经常会被考察的知识点,甚至要求当场写出实现过程。笔者先后被腾讯和滴滴面试官问过这个问题,腾讯面试官是让称述整个实现过程,本人自信满满的说出来了,所以也没有对具体实现...
  • FX677588
  • FX677588
  • 2017-07-03 22:23:04
  • 6571
收藏助手
不良信息举报
您举报文章:二叉树的层序遍历
举报原因:
原因补充:

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