leetcode刷题题解——107. 二叉树的层序遍历 II

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    List<List<Integer>> lists = new ArrayList<>();
    if (root==null) return lists;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    int levelSize = 1;
    List<Integer> levelList = new ArrayList<>();
    while (!queue.isEmpty()){
        TreeNode node = queue.poll();
        levelList.add(node.val);
        levelSize--;
        if (node.left!=null) queue.offer(node.left);
        if (node.right!=null) queue.offer(node.right);
        if (levelSize==0){
            levelSize = queue.size();
            lists.add(0,levelList);
            levelList = new ArrayList<>();
        }
    }
    return lists;
}

思路

  • 由于使每一层都有自己的levelList,所以用一个嵌套的list来保存返回结果
  • 如果root==null,直接返回嵌套空表
  • 将root存进队列,并创建levelList表对象
  • 队列弹出节点,将节点值存进levelList,levelSize减1
  • 用levelSize判断当前层的节点是否完全遍历
  • levelSize==0时,将当前层的levelList对象存进list中(注意,是往表头添加),并给levelList创建空表,最后将下一层节点数目(即队列大小)赋给levelSize
  • 返回list

这道题我是投机取巧了,其实如果看过我102. 二叉树的层序遍历的题解的朋友可以发现,其实我仅仅是改变了levelList添加进lists的位置,一个是表头、一个是表尾

上一篇:如何定位那些SQL产生了大量的redo日志


下一篇:Node.js