在讲本题之前先回顾一下广度优先搜素
广度优先搜索:
广度优先搜索是一种图算法,针对图和树的一种遍历算法。
class TreeNode: # 创建节点类
def __init__(self,val):
self.val = val
self.left,self.right = None,None
class Tree: # 创建树
def __init__(self):
self.root = None
def add_element(self,node_value): # 向树添加元素
node = TreeNode(node_value)
if self.root is None: # 判断
self.root = node
return
queue = [self.root] # 创建队列queue
while True: # 下探到下一层判断该节点是否有左右子树
pop_node = queue.pop(0)
if not pop_node.left :
pop_node.left = node
return
else:
queue.append(pop_node.left)
if pop_node.right is None:
pop_node.right = node
return
else:
queue.append(pop_node.right)
def breadth_travel(self): # 遍历
if not self.root:
return
queue = [self.root]
while queue:
node = queue.pop(0)
print(node.val,end = ' ')
if node.left: # 判断左右子树是否为空,不为空添加到队列中
queue.append(node.left)
if node.right:
queue.append(node.right)
102.二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
解法一
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root : return [] # 先判断有无根节点
queue = [root] # 根节点入队
res = []
while queue:
# 将每层的元素以列表的形式添加到res中
res.append([node.val for node in queue])
l1 = [] # 保存当前层的孩子节点
for node in queue:
if node.left :
l1.append(node.left)
if node.right:
l1.append(node.right)
queue = l1 # 对queue进行更新,遍历下一层
return res
解法2:一种解法1更为简洁的写法,在运行时间上也略优于解法1
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root: return []
queue = [root]
res = []
while queue:
res.append([node.val for node in queue])
l1 = []
for node in queue:
# 使用extend这个内置函数向l1中添加当前层元素的孩子节点
l1.extend([node.left,node.right])
queue = [leaf for leaf in l1 if leaf] # 更新queue,遍历下一层
return res
extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
实例:
aList = [123, 'xyz', 'zara', 'abc', 123]
bList = [2021, 'liner']
aList.extend(bList)
print(aList)