Problem: 103. 二叉树的锯齿形层序遍历
文章目录
题目
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示:
树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100
分类
迭代,递归,广度优先遍历
思路
和102一样,只是需要多判断一个条件标志位,用于切换左右顺序
因为root节点可以看做是从左到右,所以标志位的初始值为True,表示从左到右遍历
如果本次是False,从右到左,则在每一层的队列中追加元素时,追加到队列的开头
如果本次是True,从左到右,则在每一层的队列中追加元素时,追加到队列的结尾
解题方法
迭代
时间复杂度
O ( n ) O(n) O(n)
Code
python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def zigzagLevelOrder(self, root: [TreeNode]) :
"""
迭代
"""
if not root:
return []
res = []
queue = [root]
# 一个标志位,用于切换左右顺序,False:表示右到左,True:表示左到右
flag = True
while queue:
size = len(queue)
level = []
for i in range(size):
q = queue.pop(0)
# 当前层标志位为false,在队列开头插入元素
if flag == False:
level.insert(0,q.val)
# 当前层标志位为true,在队列结尾插入元素
else:
level.append(q.val)
if q.left:
queue.append(q.left)
if q.right:
queue.append(q.right)
# 每一层遍历结束后,翻转标志位
flag = not flag
res.append(level)
return res
递归
奇数层在队列开始插入元素,偶数层在队列结尾插入元素
用depth和2取余判断当前是奇数层还是偶数层
时间复杂度
O ( n ) O(n) O(n)
Code
python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def zigzagLevelOrder(self, root: [TreeNode]) :
"""
递归
"""
if not root:
return []
res = []
def dfs(node,depth):
if not node:
return
if len(res)==depth:
res.append([])
# 当前层标志位为false(即当前为奇数层),在队列开头插入元素
if depth % 2 != 0:
res[depth].insert(0,node.val)
# 当前层标志位为true(即当前为偶数层),在队列结尾插入元素
else:
res[depth].append(node.val)
dfs(node.left,depth+1)
dfs(node.right,depth+1)
dfs(root,0)
return res