1、原理介绍
层序遍历:若树为空,则空操作返回;若不为空,从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对节点逐个访问。
下图所示的例子,按照层序遍历,遍历顺序为:ABCDEFGHI。
思路:用队列解决,先进先出!从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。
队列实现:遍历从根结点开始,首先将根结点入队,然后开始执行循环:结点出队、访问该结点、其左右儿子入队
!!!注意:队列中每个节点应该是存储一个二叉树的指针,这样才能依次依靠指针left和right访问下去。
2、c++实现
#include<iostream>
#include<queue>
using namespace std;
/*二叉树结构体,并且构建了有参构造函数*/
struct BinaryTree{
int val;
BinaryTree* left;
BinaryTree* right;
BinaryTree(int data)
:val(data), left(NULL), right(NULL){}
};
/*队列实现层序遍历*/
void printTree(BinaryTree* s_arr[])
{
queue<BinaryTree*> rel; //定义一个队列,数据类型是二叉树指针,不要仅是int!!不然无法遍历
rel.push(s_arr[0]);
while (!rel.empty())
{
BinaryTree* front = rel.front();
cout << front->val<<" ";
rel.pop(); //删除最前面的节点
if (front->left != NULL) //判断最前面的左节点是否为空,不是则放入队列
rel.push(front->left);
if (front->right != NULL) //判断最前面的右节点是否为空,不是则放入队列
rel.push(front->right);
}
}
int main()
{
BinaryTree* s_arr[6]; //构建二叉树
s_arr[0] = new BinaryTree(0);
s_arr[1] = new BinaryTree(1);
s_arr[2] = new BinaryTree(2);
s_arr[3] = new BinaryTree(3);
s_arr[4] = new BinaryTree(4);
s_arr[5] = new BinaryTree(5);
s_arr[0]->left = s_arr[1]; // 0
s_arr[0]->right = s_arr[2]; // 1 2
s_arr[1]->left = s_arr[3]; // 3 5
s_arr[3]->left = s_arr[4]; //4
s_arr[2]->right = s_arr[5]; //所以层序遍历的结果为:0 1 2 3 5 4
printTree(s_arr); //层次遍历打印所有节点
for (int i = 0; i < 6; i++) //释放所有空间
delete s_arr[i];
return 0;
}