Given the roots of two binary search trees, root1 and root2, return true if and only if there is a node in the first tree and a node in the second tree whose values sum up to a given integer target.
Example 1:
Input: root1 = [2,1,4], root2 = [1,0,3], target = 5
Output: true
Explanation: 2 and 3 sum up to 5.Example 2:
Input: root1 = [0,-10,10], root2 = [5,1,7,0,2], target = 18
Output: falseConstraints:
[1, 5000].-10⁹ <= Node.val, target <= 10⁹class Solution:
def twoSumBSTs(self, root1: Optional[TreeNode], root2: Optional[TreeNode], target: int) -> bool:
def dfs(curr_node, node_list):
if not curr_node:
return
node_list.append(curr_node.val)
dfs(curr_node.left, node_list)
dfs(curr_node.right, node_list)
node_list1, node_list2 = [], []
dfs(root1, node_list1)
dfs(root2, node_list2)
for a in node_list1:
for b in node_list2:
if a + b == target:
return True
return FalseWhere and are the number of nodes in the two trees.
class Solution:
def twoSumBSTs(self, root1: Optional[TreeNode], root2: Optional[TreeNode], target: int) -> bool:
def binarySearch(root2, target2):
if not root2:
return False
if root2.val == target2:
return True
elif root2.val > target2:
return binarySearch(root2.left, target2)
else:
return binarySearch(root2.right, target2)
def dfs(root, target):
if not root:
return False
if binarySearch(root2, target - root.val):
return True
return dfs(root.left, target) or dfs(root.right, target)
return dfs(root1, target)Where and are the number of nodes in the two trees.
class Solution:
def twoSumBSTs(self, root1: Optional[TreeNode], root2: Optional[TreeNode], target: int) -> bool:
def dfs(curr_node, node_set):
if not curr_node:
return
dfs(curr_node.left, node_set)
node_set.add(curr_node.val)
dfs(curr_node.right, node_set)
node_set1, node_set2 = set(), set()
dfs(root1, node_set1)
dfs(root2, node_set2)
for value1 in node_set1:
if target - value1 in node_set2:
return True
return FalseWhere and are the number of nodes in the two trees.
class Solution:
def twoSumBSTs(self, root1: Optional[TreeNode], root2: Optional[TreeNode], target: int) -> bool:
def dfs(curr_node, node_list):
if not curr_node:
return
dfs(curr_node.left, node_list)
node_list.append(curr_node.val)
dfs(curr_node.right, node_list)
node_list1, node_list2 = [], []
dfs(root1, node_list1)
dfs(root2, node_list2)
pointer1 = 0
pointer2 = len(node_list2) - 1
while pointer1 < len(node_list1) and pointer2 >= 0:
if node_list1[pointer1] + node_list2[pointer2] == target:
return True
elif node_list1[pointer1] + node_list2[pointer2] < target:
pointer1 += 1
else:
pointer2 -= 1
return FalseWhere and are the number of nodes in the two trees.
class Solution:
def twoSumBSTs(self, root1: Optional[TreeNode], root2: Optional[TreeNode], target: int) -> bool:
def morris_traversal(root):
current = root
while current:
if not current.left:
yield current.val
current = current.right
else:
pre = current.left
while pre.right and pre.right != current:
pre = pre.right
if not pre.right:
pre.right = current
current = current.left
else:
pre.right = None
yield current.val
current = current.right
def reversed_morris_traversal(root):
current = root
while current:
if not current.right:
yield current.val
current = current.left
else:
pre = current.right
while pre.left and pre.left != current:
pre = pre.left
if not pre.left:
pre.left = current
current = current.right
else:
pre.left = None
yield current.val
current = current.left
iterater1 = morris_traversal(root1)
iterater2 = reversed_morris_traversal(root2)
value1 = next(iterater1, None)
value2 = next(iterater2, None)
while value1 is not None and value2 is not None:
if value1 + value2 == target:
return True
elif value1 + value2 < target:
value1 = next(iterater1, None)
else:
value2 = next(iterater2, None)
return FalseWhere and are the number of nodes in the two trees.