二叉树的层序遍历

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

 

层序遍历也很好理解,一层一层的将你的二叉树遍历后输出。根据这个图输出顺序也就是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循环控制你循环的条件就是你队列条件如果是空的话,那就说明已经没有再进入队列的元素,代码并不难需要的是思想和细节,我的程序到现在还有一些小问题,不过编译调试了几次之后认为问题不在层序遍历这个函数,应该是自己对队列的一些操作的问题,还是得再仔细的调试几遍找到问题,感觉写代码提升的是你对程序,对语言的运用,锻炼的是编写程序的思想,但是调试才是对你编码能力的提升。自己还是需要把自己写的每个程序都仔仔细细跑一遍,找出每一个小问题。

  

 

猜你喜欢

转载自blog.csdn.net/hanani_jia/article/details/79968615