102. 二叉树的层序遍历 [中等]

49 阅读1分钟

题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

解法一

思路

使用BFS(Breadth First Search)广度优先遍历。基于队列实现。

有一个点需要注意:怎么决定每层的个数呢?也就是什么时候在里面new新的list。

这个可以根据每次queue的size决定。

代码

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            List<Integer> list = new LinkedList<>();
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                list.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            res.add(list);
        }
        return res;
    }

解法二

思路

DFS(Depth First Search),深度优先遍历。使用递归的方式。

代码

    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>>  res = new LinkedList<>();
        dfs(root, res, 0);
        return res;
    }

    private void dfs(TreeNode root, List<List<Integer>>  res, int level) {
        if (root == null) {
            return;
        }

        if (res.size() - 1 < level) {
            res.add(new LinkedList<>());
        }
        List<Integer> list = res.get(level);

        list.add(root.val);
        dfs(root.left, res, level + 1);
        dfs(root.right, res, level + 1);
    }