方法一: 层序遍历 + 栈
BFS 循环: 循环打印奇 / 偶数层,当 stack_odd 和 stack_even 都为空时跳出;
- 打印奇数层: 从左向右 打印,先左后右 加入下层节点;
- 打印偶数层: 从右向左 打印,先右后左 加入下层节点;
退出循环后:
- 当最后一行是奇数行时,result末尾会多加一个[],则result.pop()
- 当最后一行是偶数行时,result倒数第二个元素是[],则result[-1] = result.pop()
时间复杂度:
- N为二叉树的节点数量,即 BFS 需循环 N 次,占用 O(N)O(N) 。共完成 少于 N 个节点的倒序操作,占用 O(N)。
空间复杂度:
- 最差情况下,即当树为满二叉树时,最多有 N/2个树节点同时在 栈 中,使用 O(N) 大小的额外空间。
from typing import List
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
result = []
if not root:
return result
stack_odd = []
stack_even = []
p = root
stack_odd.append(p)
while stack_odd or stack_even:
# 打印奇数层
temp = []
while stack_odd:
# 从左向右打印
p = stack_odd.pop()
temp.append(p.val)
# 先左后右加入下层节点
if p.left:
stack_even.append(p.left)
if p.right:
stack_even.append(p.right)
result.append(temp)
# 打印偶数层
temp = []
while stack_even:
# 从右向左打印
p = stack_even.pop()
temp.append(p.val)
# 先右后左加入下层节点
if p.right:
stack_odd.append(p.right)
if p.left:
stack_odd.append(p.left)
result.append(temp)
if not result[-1]: # 当最后一行是奇数行时,result末尾会多加一个[]
result.pop()
elif not result[-2]: # 当最后一行是偶数行时,result倒数第二个元素是[]
result[-1] = result.pop()
return result
方法二: 层序遍历 + 倒序
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
from collections import deque
res, queue = [], deque()
queue.append(root)
while queue:
tmp = []
for _ in range(len(queue)):
p = queue.popleft()
tmp.append(p.val)
if p.left:
queue.append(p.left)
if p.right:
queue.append(p.right)
res.append(tmp[::-1] if len(res) % 2 else tmp)
return res