December 14, 2024
Here are two solutions. One is recursive and the other iterative. The iterative solution is better as it can handle larger inputs.
Recursive
1from collections import deque2# Definition for a binary tree node.3# class TreeNode:4# def __init__(self, val=0, left=None, right=None):5# self.val = val6# self.left = left7# self.right = right8class BSTIterator:910 def __init__(self, root: Optional[TreeNode]):11 self.nodes = deque([])1213 def traverse(node):14 if not node:15 return1617 traverse(node.left)18 self.nodes.append(node.val)19 traverse(node.right)2021 traverse(root)222324 def next(self) -> int:25 return self.nodes.popleft()2627 def hasNext(self) -> bool:28 return len(self.nodes) > 0293031# Your BSTIterator object will be instantiated and called as such:32# obj = BSTIterator(root)33# param_1 = obj.next()34# param_2 = obj.hasNext()
Time complexity is O(n) = n and space complexity is O(h).
iterative
1from collections import deque2# Definition for a binary tree node.3# class TreeNode:4# def __init__(self, val=0, left=None, right=None):5# self.val = val6# self.left = left7# self.right = right8class BSTIterator:910 def __init__(self, root: Optional[TreeNode]):11 self.nodes = []12 self.pushAll(root)1314 def next(self) -> int:15 node = self.nodes.pop()16 self.pushAll(node.right)17 return node.val1819 def hasNext(self) -> bool:20 return len(self.nodes) > 02122 def pushAll(self, node):23 while node:24 self.nodes.append(node)25 node = node.left26272829# Your BSTIterator object will be instantiated and called as such:30# obj = BSTIterator(root)31# param_1 = obj.next()32# param_2 = obj.hasNext()
LeetCode 103. Binary Tree Zigzag Level Order Traversal
LeetCode 133. Clone Graph