MUYANG GUO / INDEX

LeetCode

LeetCode 102 Binary Tree Level Order Traversal - Medium

102. Binary Tree Level Order Traversal

·2 min read·#LeetCode#Medium#Python

102. Binary Tree Level Order Traversal — Medium

Open on LeetCode

Problem

  1. Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example: Given binary tree [3,9,20,null,null,15,7], 3 /
9 20 /
15 7 return its level order traversal as: [ [3], [9,20], [15,7] ]

Solution

### 1. 单队列的实现方式:
 
"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""
 
class Solution:
    """
    @param root: A Tree
    @return: Level order a list of lists of integer
    """
    def levelOrder(self, root):
        # write your code here
        if not root:
            return []
        # step 1. 把第一层的节点 防盗队列当中
        queue = collections.deque([root])
        res = []
        # step 2. while 队列非空
        while queue:
            level = []
            # step 3 把上一层的节点,拓展出下一层的节
            for i in range(len(queue)):
                ### pop the first in the queue in current level
                node = queue.popleft()
                ### update this node val in the level list
                level.append(node.val)
                ### find children in left and right, if any append to the tail of teh queue
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                    
            res.append(level)
            
        return res
 
### 2. 双队列的实现方式:
 
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root):
        ### two queue (two lists)
        if not root:
            return []
        ### use list for queue and next_queue
        queue = [root]
        res = []
        while queue:
            ### start a new next_queue
            next_queue = []
            res.append([node.val for node in queue])
            for node in queue:
                if node.left:
                    next_queue.append(node.left)
                if node.right:
                    next_queue.append(node.right)
            ### next_queue is now queue
            queue = next_queue
 
        return res
 
### 3. Dummy Node 的实现方式:
 
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root):
        ### DummyNode
        ### use a Dummy Node in the queue to represent the end of the level:
        
        if not root:
            return []
        ### 这里要初始化的时候就带上末尾的dummy node
        queue = collections.deque([root, None])
        res, level = [],[]
        
        ### 使用dummy node只需要pop就好
        while queue:
            node = queue.popleft()
            ### 如果当前node是dummy node,说明这一层已经pop完
            if node is None:
                ### 更新level到res里
                res.append(level)
                ### reset level
                level = []
                ### 如果queue里还有node,说明还有下一层
                if queue:
                    ### 那么需要更新下一层的尾巴,加上dummy node
                    queue.append(None)
                ### 这里需要跳过,因为更新到了下一层了
                continue
            ### 如果当前node不是dummy node
            ### 更新 level
            level.append(node.val)
            ### 把当前node的children加进queue
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        
        return res

Comments