每日一扣103. 二叉树的锯齿形层次遍历
Posted 李彬的技术笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一扣103. 二叉树的锯齿形层次遍历相关的知识,希望对你有一定的参考价值。
Difficulty: 中等
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
Solution
相关题目:
解法一:
这道题是层序遍历的变种,只不过对队列的操作要稍微复杂一点,需要依次对队列的两端做添加和移除操作。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
queue, res, flag = deque([root]), [], 1 # flag控制往队列添加元素的方式和取出元素的方式
while queue:
curLevel, size = [], len(queue)
for i in range(size):
if flag == -1: # flag为-1,先遍历左子树后遍历右子数,往队列的添加方式为appendleft
node = queue.pop()
if node.right:
queue.appendleft(node.right)
if node.left:
queue.appendleft(node.left)
else:
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
curLevel.append(node.val)
flag = flag * -1
res.append(curLevel)
return res
解法二:
# Definition for a binary tree node.
# 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) -> List[List[int]]:
if not root:
return []
queue, res = [root], []
while queue:
curLevel, size = [], len(queue)
for i in range(size):
node = queue.pop(0)
curLevel.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
res.append(curLevel)
z = []
for i, v in enumerate(res):
if i % 2 != 0:
z.append(v[::-1])
else:
z.append(v)
return z
来都来了,点个
在看
,好吗
以上是关于每日一扣103. 二叉树的锯齿形层次遍历的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 103 二叉树的锯齿形层次遍历 以及 LinkedList
LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)