102. 二叉树的层序遍历

102. 二叉树的层序遍历

题目链接
代码随想录

分析

我最开始的想法,是先用中序遍历遍历所有元素(这样,同一层的左边的元素始终排在这一层右边的元素的前面),同时带高度信息,将遍历结果结果放到一个列表里面,然后从头遍历列表,根据节点的高度,来将节点进行分离。
但是官方答案更巧妙,直接使用队列这个数据结构,具体过程如下:

其巧妙的地方在于:

层序遍历或者说广度优先遍历的本质,就是一层层的遍历。

解题

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    // 先获取从上到下的,然后再反转
    List<List<Integer>> result = new ArrayList<>();
    if(root==null){
        return result;
    }
    Deque<TreeNode> queue = new ArrayDeque<>();
    queue.offer(root);
    while(!queue.isEmpty()){
	    // 这里一次循环就是遍历一层的节点
        List<Integer> levelVals = new ArrayList<>();
        // 获取这一层的长度
        int length = queue.size();
        // 遍历这一层的每一个节点
        while(length>0){
            TreeNode node = queue.poll();
            levelVals.add(node.val);
            // 移除一个节点的时候,将其子节点放到队列中
            if(node.left!=null){
                queue.offer(node.left);
            }
            if(node.right!=null){
                queue.offer(node.right);
            }
            length--;
        }
        result.add(levelVals);
    }
    return result;
}

相关题

107. 二叉树的层序遍历 II
199. 二叉树的右视图
637. 二叉树的层平均值
429. N 叉树的层序遍历
515. 在每个树行中找最大值
116. 填充每个节点的下一个右侧节点指针
117. 填充每个节点的下一个右侧节点指针 II
104. 二叉树的最大深度
111. 二叉树的最小深度