剑指 Offer 32 - II. 从上到下打印二叉树 II
思路:BFS(参考55)
创建一个队列/列表que来储存每层节点
由于需要每层打印,创建一个临时列表p来存每一层的打印结果
需要一个中间变量temp储存每层遍历的节点,每次遍历更新que重置temp(这样需要额外的存储空间来储存每一层的节点)
改进:用两端队列来储存节点,遍历时对队列进行操作:
每次遍历,删除队列左边第一个旧节点,同时将新节点添加至队列末尾
每层的循环次数为len(que),这样不需要额外存储空间
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
#ans储存最终打印结果,que储存每一层节点
ans=[]
que=[root]
while que:
#temp储存遍历到的新节点,更新que,p储存每一层的打印结果
temp=[]
p=[]
for i in que:
p.append(i.val)
if i.left:temp.append(i.left)
if i.right:temp.append(i.right)
#更新que,将该层打印结果添加至ans中
que=temp
ans.append(p)
return ans
剑指 Offer 32 - III. 从上到下打印二叉树 III
思路同上,需要添加一个标志变量确定奇偶层
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
res,que=[],collections.deque()
que.append(root)
#标志符,大于0为奇数层,小于0偶数层,每层更新乘-1
f=1
while que:
p=[]
#奇数层正向打印,删除头节点,新节点添加至队尾
if f>0:
for _ in range(len(que)):
node=que.popleft()
p.append(node.val)
if node.left:que.append(node.left)
if node.right:que.append(node.right)
#偶数层逆向打印,删除尾节点,新节点添加至队头
if f<0:
for _ in range(len(que)):
node=que.pop()
p.append(node.val)
if node.right:que.appendleft(node.right)
if node.left:que.appendleft(node.left)
res.append(p)
#翻转标志位
f*=-1
return res