1. 程式人生 > >【LeetCode】102. Binary Tree Level Order Traversal 解題報告

【LeetCode】102. Binary Tree Level Order Traversal 解題報告

Subject

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,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

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

Explain

層序遍歷

輸出二叉樹。

重點是 按層輸出

Solution

該題目與普通的層序遍歷輸出二叉樹不同的是,需要按層分開。
所以需要判斷當前結點是在哪一層。

solution 1

第一種方式可以使用佇列,然後用變數記錄每層結點的個數

    public List<Integer> list = new ArrayList<Integer>();

    /**
     * 遞迴方式 <br />
     * 1ms
     * 
     * @param root
     * @return
     */
public List<Integer> inorderTraversal(TreeNode root) { inOrder(root); return list; } /** * 遞迴方式 * * @param node */ public void inOrder(TreeNode node) { if (node == null) { return; } if (node.left != null) { inOrder(node.left); } list.add(node.val); if
(node.right != null) { inOrder(node.right); } }

LeetCode平臺 Run Time 是 3ms

solution 2

遞迴方式

與其他遞迴遍歷不同的是,層序遍歷遞迴,需要記錄當前結點所在的層級。
所以遞迴方法需要加上一個表示當前結點所在層級的引數。

    /**
     * 遞迴方式 <br />
     * 重要的是記錄層級<br />
     * 1ms<br />
     * eats87.36% of java submissions
     * 
     * @param root
     * @return
     */
    public List<List<Integer>> levelOrder2(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();

        levelRecursion(root, result, 0);

        return result;
    }

    /**
     * 遞迴方法
     */
    private void levelRecursion(TreeNode node, List<List<Integer>> result,
            int level) {
        if (node == null) {
            return;
        }
        if (result.size() < level + 1) {// 說明還需要新增一行
            result.add(new ArrayList<Integer>());
        }
        result.get(level).add(node.val);

        levelRecursion(node.left, result, level + 1);
        levelRecursion(node.right, result, level + 1);
    }

LeetCode平臺 Run Time 是 1ms
打敗87.36%的答案~~

歐耶(^o^)/