> 基础
1. 广度遍历优先是从给定的root节点开始,逐层次的向下访问各个节点;
2. 实现的方式是通过队列的先进先出,将从root节点开始的左孩子和右孩子压入到队列中,并顺序取出;
3. 由于是用队列实现,因此不存在用递归实现的方式。
下面是基本的广度遍历优先算法:
def breadthFirstSearch(root):
queue = []
queue.append(root)
while queue:
node = queue[0]
queue.pop(0)
print ('%d ' % node.data)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
> Leetcode - 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,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]Note:这是一道二叉树的广度优先遍历练习题,不同之处在于要分辨出每个Node所在的深度,并给出每个深度所有Node的集合。解题思路有两种,一种是使用两个队列,分别为主队列和副队列,循环主队列里的所有节点,并把所有的孩子放在副队列中。这样当主队列为空时,把副队列赋给主队列,并清空副队列,就进入到下一级深度的循环。还有一种是使用flag,在root结点后加入flag,然后每次访问到flag的时候,就意味着访问到了该深度所有的Node,并且下一个深度的所有Node都加入到了队列中,这时再加入一个flag,依此循环。这里使用第二种方法。
Answer:
def levelOrder(root):
if root is []:
return []
flag = TreeNode(65536)
queue, line, res = [], [], []
queue.append(root)
queue.append(flag)
while queue:
node = queue[0]
queue.pop(0)
if node.val is not 65536:
line.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
else:
res.append(line)
if not queue:
return res
queue.append(flag)
line = []