class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class BSTIterator:
def __init__(self, root, forward=True):
self.stack = []
self.forward = forward
self._push_all(root)
def _push_all(self, node):
while node:
self.stack.append(node)
node = node.left if self.forward else node.right
def has_next(self):
return len(self.stack) > 0
def next(self):
node = self.stack.pop()
val = node.val
if self.forward:
self._push_all(node.right)
else:
self._push_all(node.left)
return val
def find_target(root, k):
if not root:
return False
left_iter = BSTIterator(root, forward=True) # smallest to largest
right_iter = BSTIterator(root, forward=False) # largest to smallest
left_val = left_iter.next() if left_iter.has_next() else None
right_val = right_iter.next() if right_iter.has_next() else None
while left_val is not None and right_val is not None and left_val < right_val:
current_sum = left_val + right_val
if current_sum == k:
return True
elif current_sum < k:
if left_iter.has_next():
left_val = left_iter.next() # increase sum
else:
break
else:
if right_iter.has_next():
right_val = right_iter.next() # decrease sum
else:
break
return False
# Driver code
root = TreeNode(5)
root.left = TreeNode(3, TreeNode(2), TreeNode(4))
root.right = TreeNode(7, None, TreeNode(8))
print(find_target(root, 9))left_iter = BSTIterator(root, forward=True) # smallest to largest
initialize iterator to get next smallest values
right_iter = BSTIterator(root, forward=False) # largest to smallest
initialize iterator to get next largest values
while left_val is not None and right_val is not None and left_val < right_val:
loop until pointers cross or no more nodes
check if current pair sums to target
sum too small, move left pointer forward to increase sum
sum too big, move right pointer backward to decrease sum