天天看點

leetcode-107 二叉樹的層次周遊

給定一個二叉樹,傳回其節點值自底向上的層次周遊。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右周遊)

leetcode-107 二叉樹的層次周遊

思路:容易想到對樹的層次周遊是通過隊列完成的,不過發現python的queue子產品并沒有提供循環隊列,隻提供了簡單的隊列,好處是不會限制隊列的大小,難點在于怎麼分層次的把節點值存到内層隊列中,方法是:先用size擷取隊列的大小即為該層次上的節點個數,然後一次通路隊列的前size個節點,每次通路完一層都要将擷取到的隊列的值,傳回到結果中

下面是python代碼:

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

from queue import Queue

class Solution:
    
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        result = []
        
        #空樹,直接傳回
        if root == None:
            return result
        
        #非空使用隊列解決問題,采用二叉樹的層次周遊
        q = Queue()
        q.put(root)
        
        #使用二層循環輸出隊列
        while not q.empty():
            
            size = q.qsize()
            temp_list = []
            
            #使用size擷取每層的隊列的大小
            #内層循環擷取頭節點,并且處理資料,然後将其子節點入隊
            while size > 0:
                temp_node = q.get()
                temp_list.append(temp_node.val)
                
                if temp_node.left != None:
                    q.put(temp_node.left)
                if temp_node.right != None:
                    q.put(temp_node.right)
                size -= 1
                
            result.append(temp_list)
            
        result.reverse()
        
        return result