当前位置 : 首页 » 文章分类 :  算法  »  LeetCode.102.Binary Tree Level Order Traversal 二叉树的层次遍历

LeetCode.102.Binary Tree Level Order Traversal 二叉树的层次遍历

题目描述

102 Binary Tree Level Order Traversal
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

相似题目

LeetCode.102.Binary Tree Level Order Traversal 二叉树的层次遍历
LeetCode.107.Binary Tree Level Order Traversal II 二叉树自底向上层次遍历
103 Binary Tree Zigzag Level Order Traversal
https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/


解题过程

2020.05 根据每层结点个数遍历一层

利用队列做层次遍历,每次先获取当前 queue 的 size,则此时队列的长度一定就是当前层的结点个数,然后一次性取出 size 个结点遍历,完成一层遍历。

时间复杂度 O(n),空间复杂度 O(n)

private static class SolutionV202005 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if (null == root) {
            return new ArrayList<>(new ArrayList<>());
        }
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            // 当前层的节点数
            int levelCount = queue.size();
            List<Integer> levelList = new ArrayList<>();
            // 遍历当前层
            for (int i = 0; i < levelCount; i++) {
                TreeNode treeNode = queue.poll();
                levelList.add(treeNode.val);
                if (treeNode.left != null) {
                    queue.offer(treeNode.left);
                }
                if (treeNode.right != null) {
                    queue.offer(treeNode.right);
                }
            }
            // 遍历完一层,加入结果list
            res.add(levelList);
        }
        return res;
    }
}

2020.03 每层后加入分隔结点

层次遍历,或者叫 宽度优先搜索BFS, 不同的是需要找到不同层之间的分隔点,以便放到二位数组中。
每一层开始遍历的时候,当前队列中的元素个数肯定是这层的元素数,官方题解是利用这一点儿来区分层次的。
我是遍历完每一层后,在queue中放入一个标志位 flagNode ,下次再遇到这个标志位就说明当前层的结点遍历完了。

private static class SolutionV202001 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if (null == root) {
            return Collections.emptyList();
        }
        List<List<Integer>> resultList = new ArrayList<>();
        List<Integer> levelList = new ArrayList<>();

        // 层次间隔标识
        TreeNode flagNode = new TreeNode(0);
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        queue.offer(flagNode);
        while (!queue.isEmpty()) {
            TreeNode treeNode = queue.poll();
            if (treeNode == flagNode) {
                resultList.add(levelList);
                levelList = new ArrayList<>();
                if (queue.isEmpty()) {
                    break;
                }
                queue.offer(flagNode);
            } else {
                if (null != treeNode.left) {
                    queue.offer(treeNode.left);
                }
                if (null != treeNode.right) {
                    queue.offer(treeNode.right);
                }
                levelList.add(treeNode.val);
            }
        }
        return resultList;
    }
}

GitHub代码

algorithms/leetcode/leetcode/_102_BinaryTreeLevelOrderTraversal.java
https://github.com/masikkk/algorithms/blob/master/leetcode/leetcode/_102_BinaryTreeLevelOrderTraversal.java


上一篇 LeetCode.107.Binary Tree Level Order Traversal II 二叉树自底向上层次遍历

下一篇 LeetCode.104.Maximum Depth of Binary Tree 二叉树的最大深度/二叉树的高度

阅读
评论
611
阅读预计3分钟
创建日期 2020-01-20
修改日期 2020-05-13
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论