剑指 Offer 32 - I. 从上到下打印二叉树
解题思路:
- 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)
- BFS 通常借助 队列 的先入先出特性来实现
算法流程:
1.特例处理: 当树的根节点为空,则直接返回空列表 [ ] ;
2.初始化: 打印结果列表 res = [ ] ,包含根节点的队列 queue = [root]
3.BFS 循环: 当队列 queue 为空时跳出
a.初始化一个tmp列表用于添加下一层节点
b.遍历当前层节点:
(1)添加子节点: 如果队列queue中当前节点有左(右)子节点,则把左右子节点加入tmp
(2)打印当前节点值: 将当前层节点即queue中的节点值添加到res
c.更新队列queue内容为下一层节点,即另queue=tmp
4.返回值: 返回打印结果列表 res 即可
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root: return[]
res, queue =[], [root]
while queue:
tmp = []
for i in queue:
if i.left: tmp.append(i.left)
if i.right: tmp.append(i.right)
res.append(i.val)
queue = tmp
return res
补充:
collections是python自带的库,collections.deque()是双端队列,可以实现左右两端添加或取出元素的功能,时间复杂度均为O(1),同时具有栈和队列的性质。
q = collections.deque()
q.append('a') # 在队列右边添加元素‘a’,deque(['a'])
q.appendleft('b') # 在队列左边添加元素‘b’,deque(['b', 'a'])
q.extend('c') # 在队列右边添加序列,deque(['b', 'a', 'c'])
q.extendleft('d') # 在队列左边添加序列,deque(['d', 'b', 'a', 'c'])
# 取出元素
q.pop() # 右端取出
q.popleft() # 左端取出
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root: return []
res, queue = [], collections.deque()
queue.append(root)
while queue:
node = queue.popleft()
res.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
return res
剑指 Offer 32 - II. 从上到下打印二叉树 II
思路与题一的基本方法差不多,就是多了个把每一层的节点值放到一个列表li中,再把li加入到res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, queue = [], [root]
while queue:
tmp = []
li = []
for i in queue:
if i.left: tmp.append(i.left)
if i.right: tmp.append(i.right)
li.append(i.val)
res.append(li)
queue = tmp
return res
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路是在题二的基础上,多一个判断层数奇偶,如果是偶数层,就把li内容翻转再加入res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, queue = [], [root]
n = 1
while queue:
tmp,li = [], []
for i in queue:
if i.left: tmp.append(i.left)
if i.right: tmp.append(i.right)
li.append(i.val)
if n % 2 == 0:
reverse = []
for j in range(len(li)):
reverse.append(li.pop())
li = reverse
n += 1
res.append(li)
queue = tmp
return res