二叉树基本层次遍历
层次遍历又叫做广度优先遍历。
最基础的层次遍历
层次遍历就是从根节点开始访问,然后向下逐层访问,访问完一层后,接着访问下一层,知道没有结点为止。
这里主要的问题就是 当访问一个结点的时候,它的孩子结点该如何保存呢?
这里我们可以用队列来完美解决,队列FIFO,层次遍历同样如此,刚好可以将下一层的结点保存到该层的后面,出队的时候也是该层的结点先出来,其次是下层结点出来。所以这里我们可以用队列解决。
如上图,
我们可以先3入队,
然后3出队,将3的左右孩子9、20入队;
然后9、20出队,9的左右孩子8、13,20的左右孩子15、17入队
最后8 13 15 17出队,由于没有孩子了,队列也就为空,层次遍历也就结束了
public static List<Integer> simpleLevelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<Integer>();
}
//res用于存放结点
List<Integer> res = new ArrayList<Integer>();
//缓冲队列
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//将根节点放入队列中,然后不断遍历队列
queue.add(root);
//有多少元素执行多少次
while (queue.size() > 0) {
//获取当前队列的长度,这个长度相当于 当前这一层的节点个数
//每次要有出队,不然循环结束不了
TreeNode t = queue.remove();
//出队后保存到res中
res.add(t.val);
//有孩子就放入队中
if (t.left != null)
queue.add(t.left);
if (t.right != null)
queue.add(t.right);
}
return res;
}
}
主要部分就是while循环里的。
层次遍历的变换
既然会整个层次遍历,那如果我们要将每层分开呢?这样的题可以类似好几种,只要在该方法的基础上,我们实现分层,然后对每层进行功能实现便可以完成。
实现分层,我们只需要在遍历一层的时候,获取该层的结点个数size,然后对size个结点进行方法实现即可。
分层的层次遍历
例如LeetCode102,
主要代码如下
//用于保存数字,这里第一个<>里是List<Integer>,是因为要分层,每层相当于是一个数组
List<List<Integer>> res = new ArrayList<List<Integer>>();
//缓冲队列
LinkedList<TreeNode> queue = new LinkedLis