我们先看一道问题,将一棵树按照层序遍历将他列出来,如下图所示:
我们想一下,按照层序遍历的顺序应该是 1243567 。按照这个设想,我给大家讲解一下这个整体过程。
层序遍历介绍
层序遍历就是将树放入队列中,按照“进父带子”的规则,依次将树里的数据遍历一遍。
层序遍历的过程演示
我们将用图的形式将层序遍历的过程展示出来,那么我们就用上面的那个树为例。过程如下:
1这个父节点出来就会带进去2和4这两个子节点。
就得出顺序为1 2 4 3 5 6 7 ,就是我们想要的答案,所以这就是层序遍历,你懂了吗?
我们看一下完整代码
判断是否为完全二叉树(层序遍历的应用)
什么是完全二叉树,我们前面讲过,例如
这就是一个完全二叉树,除了叶子结点,其他的都是满的,而且叶子节点必须全部都是连续的,我们应该怎么去判断这时完全二叉树呢?我们就不能像判断满二叉树一样用节点个数去判断完全二叉树,因为完全二叉树的最后一排必须是连续的,这是个数判断不出来的。上面我也写了是层序遍历的应用,那就是用层序遍历,有一个很巧妙的办法,我们先说方法,等下用图来和大家说具体为什么,怎么做的。
和层序遍历不同的是我们必须将空也放入队列里面去,当我们带出来的那个是空时,就检查队列里面有没有非空,如果有非空,那么就不是完全二叉树,如果没有,那就是完全二叉树。
我们发现取出来的是N,所以就可以检索队列里是否含有非空,显而易见,这个队列里没有非空,那他就是一个完全二叉树。但是很多人就会问,想这个情况能不能判断出是不是完全二叉树
大家可以按照我上面说的方法,判断一下,答案是不是完全二叉树,我们带出来的第一个空是3的左孩子,当时我们队列里面有7 5 6 的子节点,但是7的子节点有6这个非空。所以这个不是完全二叉树。是不是很奇妙?
我们看一下完整代码