深度优先遍历 / 搜索(Breadth-First Search/Traversal)是树结构中常见的操作,有着广泛的用处,这里对不同的实现方式做了分别介绍。

迭代方式实现

模板:

queue<type> q;
q.push(初始状态);
while (!q.empty())
{
  type t = q.front() ;
  q.pop();
  遍历 t 的各个Next状态  next
  { 
    if (next is legal)
      q.push(next); 计数或维护等; 
  } 
}

  这里针对两种输出方式做了具体讨论,输出为一维数组:

def breadth_first_search(self, root):
	"""
	return a list such as: [6, 4, 8, 3, 5, 7, 9]
	"""
	if root is None:
		return []
	queue = [root]
	res = []
	while queue:
		node = queue.pop(0)
		res.append(node.val)
		if node.left is not None:
			queue.append(node.left)
		if node.right is not None:
			queue.append(node.right)

	return res

输出为二维数组:

def breadth_first_search_level(self, root):
	if root is None:
		return []
	queue = [root]
	res = []
	while queue:
		level = []
		size = len(queue)
		for i in range(size):
			node = queue.pop(0)
			level.append(node.val)
			if node.left is not None:
				queue.append(node.left)
			if node.right is not None:
				queue.append(node.right)
		res.append(level)
	return res

递归方式实现

  这里所谓的 BFS 递归形式,其实是利用 DFS 的递归形式,在递归过程中记录每个结点的 level,然后将属于一个 level 的结点对应放到 list 中。

# 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):
        if not root:
            return []
        res = []
        self.bfs(root, 0, res)
        return res
        
    def bfs(self, root, level, lis):
        if not root:
            return
        # 如果 level 遍历到下一层就要补充一个新的列表保存下一层的结点
        if level >= len(lis):
            sub_lis = [root.val]
            lis.append(sub_lis)
        else:
            lis[level].append(root.val)
        self.bfs(root.left, level + 1, lis)
        self.bfs(root.right, level + 1, lis)
# Runtime: 8 ms, faster than 99.95% of Python online submissions for Binary Tree Level Order Traversal.
# Memory Usage: 12.6 MB, less than 11.76% of Python online submissions for Binary Tree Level Order Traversal.

References

  1. 102. Binary Tree Level Order Traversal