目录/Table of Content
第二十二天问:Binary Tree Zigzag Level Order Traversal
这次题目要求要对二叉树进行锯齿形层次遍历 (Zigzag Level Order Traversal)。意思就是,现在这二叉树每个节点只包含一个整数,然后从顶层开始遍历,以次先从左往右,到下一层遍历再从右往左,以此类推,层与层之间交替进行。
大家好,我是一个喜欢研究算法、机械学习和生物计算的小青年,我的CSDN博客是:一骑代码走天涯
如果您喜欢我的笔记,那么请点一下关注、点赞和收藏。如果內容有錯或者有改进的空间,也可以在评论让我知道。😄
题目&示例 (引用自 LeetCode)
Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree[3,9,20,null,null,15,7]
,
Example:
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
解题思路
我在解这题的时候,想到的最简单的就是跟所有遍历法一样:把所有节点都遍历一次,把数值放到列表中再返回出来。
这次我採用了原始的迭代而非递归来完成题目。其中,在每次迭代开始前,都会透过一个变数left_or_right
来检查是从左到右,还是从右到左遍历,直到记録每层节点currNodes
的列表只包含Null
才结束。
代码 (已提交,通过)
时间复杂度:O(
n
n
n)
空间复杂度:O(
n
n
n)
# 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]]:
res = []
if root is None:
return res
currNodes = [root]
left_or_right = 0 # %2 == 0:next is right; %2 == 1:next is left
while True:
while True:
try:
currNodes.remove(None)
except:
break
if len(currNodes) == 0:
break
nextNodes = []
sub_vals = []
for node in currNodes:
sub_vals.append(node.val)
res.append(sub_vals)
if left_or_right % 2 == 0: # next from right
for node in reversed(currNodes):
nextNodes.append(node.right)
nextNodes.append(node.left)
elif left_or_right % 2 == 1: # next from left
for node in reversed(currNodes):
nextNodes.append(node.left)
nextNodes.append(node.right)
currNodes = nextNodes
left_or_right += 1
return res