【数据结构与算法】二叉树的层序遍历
2016-03-12 11:08
302 查看
转载请注明出处: http://blog.csdn.net/ns_code/article/details/13169703
前面有篇博客详细分析了二叉树三种遍历(前序、中序、后序)方式的递归与非递归实现,参见:http://blog.csdn.net/ns_code/article/details/12977901,但把二叉树的层序遍历算法给漏掉了,实际上也不能说漏掉了,毕竟层序遍历的实现方法与这三种遍历的实现方法有所不同,因此单独拿出来分析比较合适。
二叉树的层序遍历的实现还是比较简单的,由于其层级的关系,很明显要用到队列来辅助实现,主要是从左向右,自上而下,依次将二叉树的各节点入队,这样便可以保证输出的顺序是层序排列的。下面是算法的实现思想:
先将树的根节点入队,
如果队列不空,则进入循环
{
将队首元素出队,并输出它;
如果该队首元素有左孩子,则将其左孩子入队;
如果该队首元素有右孩子,则将其右孩子入队
}
C语言代码如下:
[cpp] view
plain copy
void LevelOrderTraverse(BiTree T,Status(*Visit)(TElemType))
{
//Visit是对节点操作的应用函数,
//在这里,对每个数据元素调用函数Visit,也即是遍历了该节点
SqQueue q;
QElemType p;
if(T)
{
InitQueue(&q);
EnQueue(&q,T);
while(!QueueEmpty(q))
{
DeQueue(&q,&p);
Visit(p->data);
if(p->lchild!=NULL) EnQueue(&q,p->lchild);
if(p->rchild!=NULL) EnQueue(&q,p->rchild);
}
printf("/n");
}
}
前面有篇博客详细分析了二叉树三种遍历(前序、中序、后序)方式的递归与非递归实现,参见:http://blog.csdn.net/ns_code/article/details/12977901,但把二叉树的层序遍历算法给漏掉了,实际上也不能说漏掉了,毕竟层序遍历的实现方法与这三种遍历的实现方法有所不同,因此单独拿出来分析比较合适。
二叉树的层序遍历的实现还是比较简单的,由于其层级的关系,很明显要用到队列来辅助实现,主要是从左向右,自上而下,依次将二叉树的各节点入队,这样便可以保证输出的顺序是层序排列的。下面是算法的实现思想:
先将树的根节点入队,
如果队列不空,则进入循环
{
将队首元素出队,并输出它;
如果该队首元素有左孩子,则将其左孩子入队;
如果该队首元素有右孩子,则将其右孩子入队
}
C语言代码如下:
[cpp] view
plain copy
void LevelOrderTraverse(BiTree T,Status(*Visit)(TElemType))
{
//Visit是对节点操作的应用函数,
//在这里,对每个数据元素调用函数Visit,也即是遍历了该节点
SqQueue q;
QElemType p;
if(T)
{
InitQueue(&q);
EnQueue(&q,T);
while(!QueueEmpty(q))
{
DeQueue(&q,&p);
Visit(p->data);
if(p->lchild!=NULL) EnQueue(&q,p->lchild);
if(p->rchild!=NULL) EnQueue(&q,p->rchild);
}
printf("/n");
}
}
相关文章推荐
- 《数据结构》2.1递增链表的合并
- 【数据结构与算法】二叉树递归与非递归遍历(附完整源码)
- 【数据结构队列的应用】用队列打印杨辉三角
- 【数据结构队列的应用】用队列打印杨辉三角
- 2015年大二上-数据结构-内部排序-(3)-冒泡排序
- 2015年大二上-数据结构-内部排序-(2)-希尔排序
- 2015年大二上-数据结构-内部排序-(1)-直接插入排序
- 举例讲解Python中的list列表数据结构用法
- 数据结构分类
- 举例讲解Python中的list列表数据结构用法
- 数据结构学习
- 如何学好算法和数据结构之我见——51CTO名家访谈实录
- 《大话数据结构》学习记录1--第1,2章和第3章的顺序线性表
- 343D/Codeforces Round #200 (Div. 1) D. Water Tree dfs序+数据结构
- 数据结构习题集1
- 2015年大二上-数据结构-查找-2-(3)-B-树的基本操作
- Java_数据结构(哈希表简介)
- CSU 1690 期望DP + 数据结构
- linux内核数据结构之链表
- Codeforces 650D. Zip-line (动态LIS) (可持久化线段树 或 离线+树状数组)