天天看點

leetcode-102. 二叉樹的層序周遊

leetcode-102. 二叉樹的層序周遊
leetcode-102. 二叉樹的層序周遊

JAVA解法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 定義結果集
        List<List<Integer>> ret = new ArrayList<>();
        // 對根節點進行判空
        if (root == null) {
            return ret;
        }
        // 定義一個存放二叉樹節點的隊列
        Queue<TreeNode> queue = new LinkedList<>();
        // 将根節點加入隊列
        queue.offer(root);
        // 隻要隊列不為空就進入循環
        while (!queue.isEmpty()) {
            // 定義一個存放同一層級元素的集合
            List<Integer> level = new ArrayList<Integer>();
            // 擷取目前的隊列長度
            int currentLevelSize = queue.size();
            // 周遊隊列
            for (int i = 1; i <= currentLevelSize; ++i) {
                // 從隊列裡拿出一個樹節點
                TreeNode node = queue.poll();
                // 将本樹節點的值加入本層級的集合中
                level.add(node.val);
                // 如果該樹節點有左子樹節點,則将其加入到隊列中,等待下層級周遊
                if (node.left != null) {
                    queue.offer(node.left);
                }
                // 如果該樹節點有右子樹節點,則将其加入到隊列中,等待下層級周遊
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            // 将本層級的結果加入結果集中
            ret.add(level);
        }
        // 傳回最終結果集
        return ret;
    }
}           

複制

題解分析

  這道題首先定義一個存放結果集的集合,再對傳進來的樹節點進行判空。定義一個存放二叉樹節點的隊列,這個隊列就像吃飯用的盆,去阿姨那裡打飯盛飯用的待會飯還是進自己的肚子裡的,至于為什麼是盆不是碗就不扯太遠了。先把二叉樹的根節點放進去隊列,因為剛開始這一層級就一個根節點。ok,然後隻要隊列不為空,就進入循環。接下來義一個存放同一層級的所有元素集合,并擷取此時隊列的長度,為什麼要擷取隊列長度呢,重點來了,因為你還記得當初你把同一層級的所有元素加入了隊列,至于是多少個這裡要算清楚,因為女朋友還不是你的老婆是以還是要 AA 的,開玩笑,是因為題目要求的是同一層級的所有元素。

  擷取到本層級的所有元素數量後,從隊列裡取出來你之前放進去隊列的元素,取多少個呢?你放進去多少就取多少,最多兩個,因為這是二叉樹。那怎麼保證取的那幾個就是我當初放進去的那幾個?這是隊列,隊列的性質就像高鐵的安檢,你放的行李箱後才能下一個放,然後取的時候也是你先取,是以不會取錯的(别杠,我說不會錯就是不會)。取到值後,将其加入儲存目前層級元素的集合中,并判斷該樹節點下是否還有左右子節點,存在的話還是要加入隊列,等待下層級周遊。

  周遊完一層後,将儲存本層級所有元素的集合加入結果集,以此類推,直到将整棵樹周遊完,最終傳回結果集即可。