题目
给定一个二叉搜索树 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, 10^4].
-10^4 <= Node.val <= 10 ^4
root 为二叉搜索树
-10^5 <= k <= 10 ^5
来源:力扣(LeetCode)
解题思路
一个最简单的思路:遍历整棵树然后逐一检查是否存在两个数使得条件成立。
# 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:
temp=set()
def inorder(root):
if root:
inorder(root.left)
temp.add(root.val)
inorder(root.right)
inorder(root)
for i in temp: #检查是否存在另外一个值和i相加等于k
temp.remove(i)
if k-i in temp:
return True
temp.add(i)
return False
但是这样做的话显然有一个信息是没有用到的,那就是给定的二叉树是一个搜索二叉树。众所周知搜索二叉树通过中序遍历可以生成一个升序的序列,所以如果想要优化的话,那可能需要针对生成的序列进行查找优化了,比如对于当前元素i,检查是否存在另外一个元素j使得i+j=k,对于i来说如果k-i大于i则在i的后边寻找,如果k-i<i则在i的左边寻找,可以使用二分查找也可以使用哈希表。下面以二分查找为例进行优化:
# 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:
temp=[]
def inorder(root):
if root:
inorder(root.left)
temp.append(root.val)
inorder(root.right)
inorder(root)
if len(temp)<2:
return False
for i in range(len(temp)):
if k-temp[i]>temp[i]:
#如果另一个和数大于当前值,则在其右边寻找
index=bisect.bisect_left(temp,k-temp[i],i+1,len(temp))
else:
#如果另一个和数小于当前值,则在其左边寻找
index=bisect.bisect_left(temp,k-temp[i],0,i)
if len(temp)>index>=0 and temp[index]==k-temp[i] and index!=i:
return True
else:
continue
return False