LeetCode 102 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]
]

解法思路(一)

  • 二叉树的层序遍历是需要借助队列的;
  • 如果只是遍历的话,是很基础的操作,但题目对遍历结果的返回格式有要求,List>,即结果中要表示出每个节点是在哪一层的;
  • 这就需要对二叉树中的节点所在的层进行记录,具体做法是将节点和它所在的层包装成一个 Pair,进出队列的都是 Pair,每次遍历到哪个节点,就把该节点的值放进其层数对应的线性表中;

解法实现(一)

时间复杂度
  • O(n),n为树的节点个数;
空间复杂度
  • O(n),二叉树是有可能退化成链表的,在这种情况下,h = n;
关键字

二叉树 层序遍历 队列 二维线性表

实现细节
  • 在从队列中取出一个节点时,要看一下在返回结果 res 中是否有该节点的层数所对应的线性表,没有的话要先创建出来;
package leetcode._102;

import javafx.util.Pair;

import java.util.*;

public class Solution102_1 {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    public List> levelOrder(TreeNode root) {

        List> res = new ArrayList<>();

        if (root == null) {
            return res;
        }

        Queue> queue
                = new LinkedList>();
        Pair pair = new Pair(root, 0);
        queue.add(pair);

        while (!queue.isEmpty()) {
            pair = queue.poll();
            TreeNode front = pair.getKey();
            Integer level = pair.getValue();

            if (level == res.size()) {
                res.add(new ArrayList());
            }
            assert res.size() > level;

            res.get(level).add(front.val);

            if (front.left != null) {
                queue.add(new Pair(front.left, level + 1));
            }
            if (front.right != null) {
                queue.add(new Pair(front.right, level + 1));
            }
        }

        return res;
    }

}

返回 LeetCode [Java] 目录

你可能感兴趣的:(LeetCode 102 Binary Tree Level Order Traversal)