1. 程式人生 > 實用技巧 >每日一題20201204(102. 二叉樹的層序遍歷)

每日一題20201204(102. 二叉樹的層序遍歷)

102. 二叉樹的層序遍歷

樹之我見

二叉樹挺有意思,希望大家都能掌握。我也在為此努力!

其實樹用的還是挺多的,比如我在比較2個json的差異的時候,就涉及到遍歷樹,如果不知道怎麼去正確遍歷樹,還是比較麻煩的。

還有一個應用的地方就是antd的tree,當你要用到這種元件的時候,涉及到大量的遞迴,用到tree的時候還是蠻多樂趣的。

思路

樹的遍歷大體上有2種,深度和廣度,題目中很明顯要求是廣度優先遍歷。

其實我發現一個規律,如果是按廣度,那麼用迭代比遞迴方便,如果是按照深度優先遍歷,那麼遞迴比迭代方便。

所以這裡我們採取迭代的方式,一層一層把樹扒光!

首先我們處於樹的頂層,那麼我們一層一層去把資料放到佇列裡面,按照先進先出的規則,處理完畢即可。但是我們這一層要扒光多少個節點,那麼我們需要在上一層將其記錄。

比如圖中的例子,我們先把3放入佇列,然後開始判斷佇列是否為空,佇列不是空的話,就按佇列的長度N拿出N個元素,並把他們的left和right再放入佇列。

佇列情況:

1. [3]
2. [9 20]  (出來1個元素 3出佇列)
3. [15 7]  (出來2個元素,9和20,由於9沒有left和right,所以只進入15和7)
4. []
出列的元素個數等於隊列當前元素個數
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if root is None:
            return []
        nodes = [root]
        result = []
        while len(nodes) > 0:
            # 這一層的節點個數
            size = len(nodes)
            # 先加入空陣列
            result.append([])
            for i in range(size):
                # 出佇列,並加入到result
                current = nodes.pop(0)
                result[len(result)-1].append(current.val)
                # 如果左/右孩子不為空,則加入佇列
                if current.left is not None:
                    nodes.append(current.left)
                if current.right is not None:
                    nodes.append(current.right)
        return result

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) [][]int {
    if root == nil {
        return [][]int{}
    }
    result := make([][]int, 0)
    deque := []*TreeNode{root}
    for len(deque) > 0 {
        size := len(deque)
        result = append(result, make([]int, 0))
        for i:=0; i<size; i++ {
            current := deque[0]
            result[len(result)-1] = append(result[len(result)-1], current.Val)
            if current.Left != nil {
                deque = append(deque, current.Left)
            }
            if current.Right != nil {
                deque = append(deque, current.Right)
            }
            deque = deque[1:]
        }
    }
    return result

}