653. Two Sum IV - Input is a BST
BST性质解法:
做了Q167的话这题还是很顺的,Q167是sorted array确认two sum,这边只是改成了BST,而利用BST这个性质可以在O(N)得到sorted array,最后总时间还是可以控制在O(N):
BST 的 inorder traversal 是一个有序递增数组
所以也就是Q167起初上多做一个inorder traversal,做法见Q94:
94. Binary Tree Inorder Traversal167. Two Sum II - Input array is sortedclass Solution:
def findTarget(self, root: TreeNode, k: int) -> bool:
inorder, stack = [], []
cur = root
while stack or cur:
while cur:
stack.append(cur)
cur = cur.left
cur = stack.pop()
inorder.append(cur.val)
cur = cur.right
l, r = 0, len(inorder)-1
while l < r:
_sum = inorder[l] + inorder[r]
if _sum == k: return True
elif _sum < k: l += 1
else: r -= 1
return False
Hash set 解法:
也可以不去管BST性质,直接设置一个hash set来记录走过的点,然后遍历tree,看当前节点的值是否能与hash set 中任何值组成k。这个解法比较 general 且好懂,而且就这道题来看,其实平均时间/空间复杂度上都应该是优于利用BST性质解的。
class Solution:
def findTarget(self, root: TreeNode, k: int) -> bool:
memo = set()
q = collections.deque([root])
while q:
cur = q.popleft()
if k - cur.val in memo: return True
memo.add(cur.val)
if cur.left: q.append(cur.left)
if cur.right: q.append(cur.right)
return False
Last updated
Was this helpful?