BFS Level Order Traversal

102. Binary Tree Level Order Traversal

  • 解法1. Two queues

用一个Queue保存下一层要遍历的节点

class Solution(object):
    def levelOrder(self, root):
        if not root: return []

        queue = [root]
        res = []
        while queue:
            res.append([node.val for node in queue])
            nqueue = []
            for node in queue:
                if node.left: 
                    nqueue.append(node.left)
                if node.right: 
                    nqueue.append(node.right)
            queue = nqueue
        return res
  • 解法2. One Queue

Key Point: when should we change layer to the next?

class Solution(object):
    def levelOrder(self, root):
        if not root:
            return []

        queue = collections.deque([root])
        res = []
        while queue:
            l = len(queue) # save the size of queue
            level = []
            for _ in xrange(l):
                node = queue.popleft()
                level.append(node.val)
                if node.left: 
                    queue.append(node.left)
                if node.right: 
                    queue.append(node.right)
            res.append(level)
        return res

107. Binary Tree Level Order Traversal II

正着BFS的结果倒过来而已!

class Solution(object):
    def levelOrderBottom(self, root):
        if not root:
            return []
        queue = [root]
        res = []
        while queue:
            res.append([node.val for node in queue])
            nqueue = []
            for node in queue:
                if node.left: 
                    nqueue.append(node.left)
                if node.right: 
                    nqueue.append(node.right)
            queue = nqueue
        return res[::-1]

637. Average of Levels in Binary Tree

class Solution(object):
    def averageOfLevels(self, root):
        if not root:
            return []
        res = []
        queue = [root]
        while queue:
            level = [node.val for node in queue]
            ret = 1.0 * sum(level) / len(level) 
            res.append(ret)
            nqueue = []
            for node in queue:
                if node.left:
                    nqueue.append(node.left)
                if node.right:
                    nqueue.append(node.right)
            queue = nqueue
        return res

103. Binary Tree Zigzag Level Order Traversal

Deque

  • Case1: if we are on the odd level: do the same as BFS1, expand a node from the left end of the deque, generate left and then right child, and insert them to the right end of the deque.
  • Case2: if we are on the even level: expand a node from the right end of the deque, generate right and then left child, and insert them to the left end of the duque.
class Solution(object):
    def zigzagLevelOrder(self, root):
        if not root:
            return []

        queue = [root]
        res = []
        while queue:
            level = [node.val for node in queue]
            if len(res) % 2:
                level.reverse()
            res.append(level)
            nqueue = []
            for node in queue:
                if node.left: nqueue.append(node.left)
                if node.right: nqueue.append(node.right)
            queue = nqueue
        return res

results matching ""

    No results matching ""