1. 程式人生 > 實用技巧 >樹-廣度優先層次遍歷

樹-廣度優先層次遍歷

102. 二叉樹的層序遍歷
給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

 

示例:
二叉樹:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其層次遍歷結果:

[
  [3],
  [9,20],
  [15,7]
]
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left 
= None # self.right = None class Solution(object): def levelOrder(self, root): """ :type root: TreeNode :rtype: List[List[int]] """ queue = collections.deque() queue.append(root) res = [] while queue: size = len(queue) level
= [] for _ in range(size): cur = queue.popleft() if not cur: continue level.append(cur.val) queue.append(cur.left) queue.append(cur.right) if level: res.append(level)
return res
BFS使用佇列,把每個還沒有搜尋到的點依次放入佇列,然後再彈出佇列的頭部元素當做當前遍歷點。BFS總共有兩個模板:

如果不需要確定當前遍歷到了哪一層,BFS模板如下。

while queue 不空:
    cur = queue.pop()
    for 節點 in cur的所有相鄰節點:
        if 該節點有效且未訪問過:
            queue.push(該節點)
如果要確定當前遍歷到了哪一層,BFS模板如下。
這裡增加了level表示當前遍歷到二叉樹中的哪一層了,也可以理解為在一個圖中,現在已經走了多少步了。size表示在當前遍歷層有多少個元素,也就是佇列中的元素數,我們把這些元素一次性遍歷完,即把當前層的所有元素都向外走了一步。

level = 0
while queue 不空:
    size = queue.size()
    while (size --) {
        cur = queue.pop()
        for 節點 in cur的所有相鄰節點:
            if 該節點有效且未被訪問過:
                queue.push(該節點)
    }
    level ++;
上面兩個是通用模板

作者:fuxuemingzhu
連結:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/tao-mo-ban-bfs-he-dfs-du-ke-yi-jie-jue-by-fuxuemin/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
View Code