二叉树的锯齿形层序遍历
字数 668 2025-11-10 13:10:58
二叉树的锯齿形层序遍历
题目描述:给定一个二叉树的根节点,返回其节点值的锯齿形层序遍历。即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行。
解题思路:
- 基本思路基于二叉树的层序遍历(BFS),使用队列辅助
- 关键点在于记录当前层数,根据层数的奇偶性决定遍历方向
- 偶数层(从0开始计数)从左到右,奇数层从右到左
- 可以通过反转列表或双端队列实现方向控制
详细步骤:
步骤1:基础层序遍历框架
- 使用队列进行标准的BFS层序遍历
- 每次处理一层的所有节点
- 记录当前层的节点值列表
步骤2:添加方向控制
- 设置一个标志位(如level)记录当前层数
- 当level为偶数时,按正常顺序添加节点值
- 当level为奇数时,按逆序添加节点值(或从尾部插入)
步骤3:具体实现方法
方法一:列表反转法
- 进行标准层序遍历,每层按从左到右顺序收集节点值
- 遇到奇数层时,将该层的节点值列表反转
- 将处理后的列表加入结果集
方法二:双端队列法
- 使用双端队列(deque)存储每层节点值
- 偶数层:从队列尾部插入节点值(正常顺序)
- 奇数层:从队列头部插入节点值(实现逆序)
代码实现(列表反转法):
from collections import deque
def zigzagLevelOrder(root):
if not root:
return []
result = []
queue = deque([root])
level = 0 # 记录当前层数,从0开始
while queue:
level_size = len(queue)
current_level = []
# 处理当前层的所有节点
for _ in range(level_size):
node = queue.popleft()
current_level.append(node.val)
# 添加子节点到队列
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
# 根据层数奇偶性决定顺序
if level % 2 == 1: # 奇数层,需要反转
current_level.reverse()
result.append(current_level)
level += 1 # 进入下一层
return result
复杂度分析:
- 时间复杂度:O(n),每个节点访问一次
- 空间复杂度:O(n),队列和结果集的空间开销
关键要点:
- 层序遍历是基础,方向控制是核心
- 注意处理空树的边界情况
- 层数计数从0开始,便于使用模2判断奇偶性
- 两种实现方法的时间复杂度相同,可根据具体需求选择
这种锯齿形遍历在需要交替显示数据的场景中很实用,如某些UI布局和数据分析可视化。