题目
给定一个二叉搜索树 root
和一个目标结果 k
,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true
。
示例 1:
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
示例 2:
输入: root = [5,3,6,2,4,null,7], k = 28
输出: false
提示:
- 二叉树的节点个数的范围是
[1, 104]
. -104 <= Node.val <= 104
root
为二叉搜索树-105 <= k <= 105
题解1
思路
- 中序遍历,形成有序列表
- 双指针遍历列表,查看是否有符合的元素对
代码
# 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 findTarget(self, root: Optional[TreeNode], k: int) -> bool:
nums = []
def inOrder(root):
if not root: return
if root.left: inOrder(root.left)
nums.append(root.val)
if root.right: inOrder(root.right)
inOrder(root)
i,j = 0,len(nums)-1
while i<j:
if nums[i] + nums[j] < k: i+=1
elif nums[i]+nums[j] > k: j-=1
else: return True
return False
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
题解2
思路
- 遍历二叉树,将已遍历的节点存到集合当中
- 若目标值减去该节点的值恰好存在于集合当中,则说明存在目标对
代码
# 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 findTarget(self, root: Optional[TreeNode], k: int) -> bool:
s = set()
def dfs(root):
if not root: return False
if k-root.val in s: return True
s.add(root.val)
return dfs(root.left) or dfs(root.right)
return dfs(root)
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)