1. 程式人生 > 其它 >【LeetCode】103. Binary Tree Zigzag Level Order Traversal 二叉樹的鋸齒形層次遍歷(Medium)(JAVA)每日一題

【LeetCode】103. Binary Tree Zigzag Level Order Traversal 二叉樹的鋸齒形層次遍歷(Medium)(JAVA)每日一題

技術標籤:LeetCode 每日一題二叉樹佇列leetcode面試資料結構

【LeetCode】103. Binary Tree Zigzag Level Order Traversal 二叉樹的鋸齒形層次遍歷(Medium)(JAVA)

題目地址: https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

題目描述:

Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

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

題目大意

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

解題方法

  1. 這一題其實就是二叉樹的層序遍歷,只是在每一層的時候加了一個逆序和順序的判斷
  2. 二叉樹層序遍歷:用一個佇列儲存當前這一層所有的節點;下一層取出上一次的所有節點,然後把不為空的節點再按序加進佇列裡,就是當前層的所有節點了;不斷迴圈,直到所有層的節點遍歷結束為止
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int count = 1;
        boolean flag = true;
        List<Integer> list = new ArrayList<>();
        while (queue.size() > 0) {
            TreeNode node = queue.poll();
            count--;
            if (flag) {
                list.add(node.val);
            } else {
                list.add(0, node.val);
            }
            if (node.left != null) queue.offer(node.left);
            if (node.right != null) queue.offer(node.right);
            if (count == 0) {
                res.add(list);
                list = new ArrayList<>();
                count = queue.size();
                flag = !flag;
            }
        }
        return res;
    }
}

執行耗時:1 ms,擊敗了98.42% 的Java使用者
記憶體消耗:38.7 MB,擊敗了49.52% 的Java使用者

歡迎關注我的公眾號,LeetCode 每日一題更新