0
点赞
收藏
分享

微信扫一扫

LeetCode简单题之两数之和 IV - 输入 BST

萧萧雨潇潇 2022-02-09 阅读 52

题目

给定一个二叉搜索树 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

在这里插入图片描述

举报

相关推荐

0 条评论