对于一颗二叉树,从根结点开始,按从上到下、从左到右的顺序访问每一个结点,每一个结点仅仅访问一次。
算法设计思路:使用一个队列
- 将根结点进队
- 队不空时循环:从队列中出列一个结点*p,访问它;
- 若它有左孩子结点,将左孩子结点进队;
- 若它有右孩子结点,将右孩子结点进队。
二叉树的层次遍历示意图:
队列用列表表示,弹出操作用pop(索引)
,弹出会有返回值。
# 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: Optional[TreeNode]) -> List[List[int]]:
if not root:
return []
res = []
queue = [root] # 首先将根节点加入队列
while queue: # 当队列不为空时,进行循环
size = len(queue) # 查看当前队列长度
temp = [] # 返回值为二维列表, 这里设置一个空列表, 用于res.append
for _ in range(len(queue)):
r = queue.pop(0) # 弹出队首, pop操作会有返回值
temp.append(r.val) # 将数值加入temp
if r.left: # 左节点不为空, 追加到队尾
queue.append(r.left)
if r.right: # 右节点不为空, 追加到队尾
queue.append(r.right)
res.append(temp)
return res
加一层for循环是为了结果输出二维数组。
带有输入输出的完整代码
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 通过层次遍历创建二叉树
class Tree():
"""二叉树"""
def __init__(self):
self.root = None
def add(self, item):
node = TreeNode(item)
if self.root is None:
self.root = node
return
queue = [self.root]
while queue:
# 节点指针,从第一个开始
cur_node = queue.pop(0)
# 如果左节点的子节点为None,就赋值给他;否则 末尾追加
if cur_node.left is None:
cur_node.left = node
return
else:
queue.append(cur_node.left)
if cur_node.right is None:
cur_node.right = node
return
else:
queue.append(cur_node.right)
def levelOrder(root):
if not root:
return []
queue = [root]
res = []
while queue:
temp = []
for _ in range(len(queue)):
r = queue.pop(0)
if r.val is not None:
temp.append(r.val)
if r.left is not None:
queue.append(r.left)
if r.right is not None:
queue.append(r.right)
res.append(temp)
return res
if __name__ == '__main__':
tree = Tree()
for i in [3,9,20,None,None,15,7]:
tree.add(i)
print(levelOrder(tree.root))
[[3], [9, 20], [15, 7]]