二叉树的层序算法不采用递归的方式,它借助于一个队列辅助,先将节点压入队列,队列是一个先进先出的队列。
层序遍历的顺序为:
队列不为空进入循环
{
首元素出队,输出
该首元素左孩子不为空,则左孩子入队
该首元素右孩子不为空,则右孩子入队
}
代码未曾验证,请看大概思路:
//定义
struct BiTree
{
int val;
struct BiTree *left;
struct BiTree *right;
}BiTree;
queue<BiTree> q;
BiTree * p;
void LevelOrderTraverse(BiTree root)
{
if(root == NULL)
{
return;
}
q.push(root);
while(!q.empty())
{
p = q.pop();
printf("%d",p->val);
if(p->left != NULL)
q.push(p->left);
if(p->right != NULL)
q.push(p->right);
}
}
假如二叉树为:
[1,2,3,4,5,6]
每次循环队列中的元素为:
1
2 3
3 4 5
4 5 6
5 6
6
空
将每次弹出元素的左右孩子压入队列。保证了左右两边的节点都能压入队列。
下边思考如果二叉树的输出采用之字形输出呢?