前言
我在我的上一个博客写了二叉树的三种遍历(前序,中序,后序),递归与非递归表示
之后又学习了另一种二叉树的遍历,叫做层序遍历。
这一次我又学了点知识,为上一次做点补充吧。
二叉树遍历的核心问题:二维结构的线性化
- 从节点访问其左、右节点
- 访问左节点后,右节点怎么办?
- 需要一个存储结构保存暂时不访问的节点
- 存储结构:堆栈、队列
层序遍历
队列实现:遍历从根节点开始,首先将根节点入队,然后开始执行循环:节点出队、访问该节点、其左右节点入队
如图二叉树
我们用队列进行遍历分析
层序遍历基本过程
- 从队列中取出一个元素
- 访问该元素所指节点
- 若该元素左右节点非空,则将其左右节点顺序入队
层序遍历的代码实现
void LevelOrderTraversal (BinTree *BT)
{
if(!BT)
return;
queue<BinTree*>q;
BinTree *front=NULL;
q.push(BT);
while(!q.empty())
{
front = q.front();
q.pop();
cout << front->Value << " ";
if(front->Left)//如果左节点不为空,则左节点入队
q.push(front->Left);
if(front->Right)//如果右节点不为空,则右节点入队
q.push(fornt->Right);
}
}
总结
先序,中序、后序遍历,对应的是深度优先
而层序遍历对应的是广度优先。两种方式各有好处
Ps:若有错误,欢迎指出