二叉树的层序遍历

28 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

 二叉树的层序遍历如下图

​编辑

算法题目如下:

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,不好界定这个边界,所以用一次循环队列的长度来做界定,用来判断一层应该出队的个数。

\