版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/88417343
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
解题思路
参考这篇文章Leetcode 102:二叉树的层次遍历(最详细解决方案!!!)
我们只需要通过设置一个参数i
记录我们的层数,如果是偶数层
,我们将tmp list
反转一下即可。
class Solution:
def zigzagLevelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
q, result = [root], []
i = 1
while any(q):
tmp = list()
for _ in range(len(q)):
node = q.pop(0)
tmp.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
if i%2 == 0:
tmp.reverse()
result.append(tmp)
i += 1
return result
还有一种做法是通过两个栈,一个栈存储从左向右访问的顺序,另一个栈存储从右向左的访问顺序,两者交替进行。
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res = list()
s1, s2 = [root], list()
while s1 or s2:
cur = list()
if s1:
while s1:
node = s1.pop()
cur.append(node.val)
if node.left:
s2.append(node.left)
if node.right:
s2.append(node.right)
else:
while s2:
node = s2.pop()
cur.append(node.val)
if node.right:
s1.append(node.right)
if node.left:
s1.append(node.left)
res.append(cur)
return res
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!