层序遍历不是二叉树所特有的,但使用二叉树来讲解是因为在视觉和理解上更直观。顾名思议,按层遍历。如下图:
树的层序遍历对应到了图中的宽度优先搜索,需要使用一个队列辅助遍历过程,从图中也可以看出其遍历过程很符合队列的性质。
初始化一个空队列,我们让根节点入队,然后出队,查看出队节点的左孩子是否为空,非空的话,出队节点左孩子入队,查看出队节点的右孩子是否为空,非空的话,出队节点的右孩子入队。然后重复,直到队列大小为空。其实结合上图模拟下过程是很清晰的。
下面是代码
template<typename T>
void Tree<T>::Level_Order_Traverse(Tree_Node<T>* node)
{
queue<Tree_Node<T>*> Visit_Queue;
Tree_Node<T>* temp;
assert(node == root);
Visit_Queue.push(node);//根节点入队
while (Visit_Queue.size())
{
//输出队头元素
temp = Visit_Queue.front();
cout << temp->data<< " ";
//弹出队头元素
Visit_Queue.pop();
//左右节点非空入队
if (temp->left_node != NULL) Visit_Queue.push(temp->left_node);
if (temp->right_node != NULL) Visit_Queue.push(temp->right_node);
}
}
层序遍历就到说到这里了。后面图的学习笔记会在探究泛化的宽度优先搜索。