mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-13 03:27:07 +00:00
Time: 0 ms (100%), Space: 18.2 MB (28.84%) - LeetHub
This commit is contained in:
+58
@@ -0,0 +1,58 @@
|
||||
# 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: Optional[TreeNode]) -> List[List[int]]:
|
||||
"""
|
||||
Complexities:
|
||||
Time: O(n)
|
||||
Space: O(n)
|
||||
|
||||
where n = number of nodes in graph
|
||||
"""
|
||||
|
||||
if not root:
|
||||
return []
|
||||
|
||||
traversal = [[root]]
|
||||
hasNextLevel = root.left or root.right
|
||||
|
||||
|
||||
# Store nodes from left to right in arrays by depth - O(n)
|
||||
while hasNextLevel:
|
||||
lastLevel = traversal[-1]
|
||||
nextLevel = []
|
||||
hasNextLevel = False
|
||||
|
||||
for node in lastLevel:
|
||||
if node.left:
|
||||
nextLevel.append(node.left)
|
||||
hasNextLevel = hasNextLevel or bool(node.left.left or node.left.right)
|
||||
|
||||
if node.right:
|
||||
nextLevel.append(node.right)
|
||||
hasNextLevel = hasNextLevel or bool(node.right.left or node.right.right)
|
||||
|
||||
traversal.append(nextLevel)
|
||||
|
||||
# Convert nodes to values + reverse every other level - O(n)
|
||||
valueTraversal = []
|
||||
for depth, level in enumerate(traversal):
|
||||
start = 0 if depth % 2 == 0 else len(level) - 1
|
||||
end = len(level) if depth % 2 == 0 else -1
|
||||
step = 1 if depth % 2 == 0 else -1
|
||||
|
||||
nextLevelValues = []
|
||||
for i in range(start, end, step):
|
||||
nextLevelValues.append(level[i].val)
|
||||
valueTraversal.append(nextLevelValues)
|
||||
|
||||
|
||||
|
||||
return valueTraversal
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user