本文已参与[新人创作礼]活动,一起开启掘金创作之路。
二叉树的层序遍历如下图
编辑
算法题目如下:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
}
}
我们需要通过遍历二叉树每层的数据,返回一个List<List>对象,外层的List为整个二叉树,内层的List自然就是对应着二叉树的每一层。对应这种返回的数据结构特性,我们可以想到第一种解法:
解法一:
递归遍历整个二叉树,传入level值标记每层的下标,然后从List中中取出对应每层的List来进行添加,思路很简单,代码如下:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
traversal(root,result,0);
return result;
}
public void traversal(TreeNode node,List<List<Integer>> result,int level){
if(node == null){
return;
}
List<Integer> levelList = null;
if(level<result.size()){
levelList = result.get(level);
}else{
levelList = new ArrayList<>();
result.add(levelList);
}
levelList.add(node.val);
traversal(node.left,result,level+1);
traversal(node.right,result,level+1);
}
解法二:
我们还能借用队列的特性来解,比如先放根节点入队,再取出来放入list中,接着把取出来的节点的左右子节点放入队列中,直到队列为空,则说明遍历结束。这样说可能还不太明白,我们可以看图:
编辑
编辑
代码如下:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
Deque<TreeNode> dq = new ArrayDeque<>();
if(root == null){
return result;
}
dq.add(root);
while(!dq.isEmpty()){
int len = dq.size();
int i=0;
List<Integer> list = new ArrayList<>();
while(i<len){
TreeNode curr = dq.remove();
list.add(curr.val);
if(curr.left != null){
dq.add(curr.left);
}
if(curr.right != null){
dq.add(curr.right);
}
i++;
}
result.add(list);
}
return result;
}
这个解法最巧妙的地方在于双重循环,为啥要这样写呢,主要是出队之后又会将子节点放入队列中,且我们要返回的时候带层级结构的list,不好界定这个边界,所以用一次循环队列的长度来做界定,用来判断一层应该出队的个数。
\