[剑指offer]20.从上到下打印二叉树 II

题目连接:戳这里
题目描述:
4.png
解题思路:
来自leetcode大佬Krahets题解:java

  • I. 按层打印:题目要求的二叉树的从上至下打印(即按层打印),又称为二叉树的广度优先搜索(BFS)。BFS 一般借助队列的先入先出特性来实现。
  • II. 每层打印到一行:若将二叉树从上至下分为多层,则经过访问某层全部节点的 左右子节点,可统计出下一层的全部节点。根据此特性,可在打印本层所有节点时,将下一层所有节点加入队列,以此类推,便可分为多行打印。
算法流程:
  1. 特例处理:当树的根节点为空,则直接返回空列表[]
  2. 初始化:打印结果列表res = [],包含根节点的队列queue = [root]
  3. BFS 循环:当队列queue为空时跳出;node

    1. 新建一个临时列表tmp,用于存储当前层打印结果;
    2. 当前层打印循环:循环次数为队列queue长度(队列中元素为全部当前层节点);算法

      1. 出队:队首元素出队,记为node
      2. 打印:node.val添加至列表tmp尾部;
      3. 添加子节点:node的左(右)子节点不为空,则将左(右)子节点加入队列queue
    3. 将当前层结果tmp添加入res
  4. 返回值:返回打印结果列表res便可。

java代码:spa

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> que=new LinkedList<>();
        List<List<Integer>> res=new ArrayList<>();
        if(root!=null) que.add(root);
        while (!que.isEmpty()){
            List<Integer> tmp=new ArrayList<>();
            for(int i=que.size();i>0;i--){
                TreeNode node = que.poll();
                tmp.add(node.val);
                if(node.left!=null) que.add(node.left);
                if(node.right!=null) que.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }
}
相关文章
相关标签/搜索