LeetCode 二叉树的层次遍历

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]
解法一:

将每一层的节点放入队列,对于每一层新建一个 ArrayList,然后将队列里的元素的值存入这个 ArrayList,从而得到每一层的节点值。

    public List<List<Integer>> levelOrder(TreeNode root) {

        if (root == null) return new ArrayList<>();

        List<List<Integer>> lists = new ArrayList<>();

        Queue<TreeNode> q = new LinkedList<>();
        q.offer(root);

        while (!q.isEmpty()) {

            List<Integer> list = new ArrayList<>();
            int n = q.size();

            for (int i = 0; i < n; ++i) {

                TreeNode t = q.poll();
                list.add(t.val);
                if (t.left != null) q.offer(t.left);
                if (t.right != null) q.offer(t.right);
            }

            lists.add(list);
        }
        return lists;
    }
解法二:

递归求解,核心就在于我们需要一个变量 level,当 level 递归到上一层的个数时(列表的个数),我们就新建一个空列表,继续往对应 level 的列表里面添加数字。

    public List<List<Integer>> levelOrder(TreeNode root) {

        List<List<Integer>> lists = new ArrayList<>();

        reLevelOrder(root, 0, lists);

        return lists;

    }

    public void reLevelOrder(TreeNode root, int level, List<List<Integer>> lists) {

        if (root == null) {
            return;
        }

        if (lists.size() == level) {
            List<Integer> list = new ArrayList<>();
            lists.add(list);
        }

        lists.get(level).add(root.val);

        if (root.left != null) {
            reLevelOrder(root.left, level + 1, lists);
        }

        if (root.right != null) {
            reLevelOrder(root.right, level + 1, lists);
        }

    }
    原文作者:Little丶Jerry
    原文地址: https://www.jianshu.com/p/4e51ba3f358b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞