1. 程式人生 > 實用技巧 >LeetCode | 0103. 二叉樹的鋸齒形層序遍歷【Python】

LeetCode | 0103. 二叉樹的鋸齒形層序遍歷【Python】

Problem

LeetCode

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

問題

力扣

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

例如:
給定二叉樹 [3,9,20,null,null,15,7],

	3
   / \
  9  20
    /  \
   15   7

返回鋸齒形層序遍歷如下:

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

思路

BFS

當佇列不為空:
	當前層列印迴圈:
		隊首元素出隊,記為 node
		根據 flag 將 node.val 新增到 temp 尾部/頭部
		若左(右)子節點不為空,則將左(右)子節點加入佇列
	把當前 temp 中的所有元素加入 res

時間複雜度: O(n),n 為二叉樹的節點數。
空間複雜度: O(n),n 為二叉樹的節點數。

Python3 程式碼

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        import collections
        if not root:
            return []
        
        res, q = [], collections.deque()
        flag = False  # 做奇偶判斷
        q.append(root)
        
        while q:
            temp = []
            flag = not flag
            for _ in range(len(q)):
                node = q.popleft()
                # 頭插
                if flag:
                    temp.append(node.val)
                # 尾插
                else:
                    temp.insert(0, node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(temp)
        
        return res

GitHub 連結

Python