LeetCode探索(29):653-两数之和IV-输入BST

85 阅读2分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

题目

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

思考

这是二叉树相关的一道题目,难度简单。

为了验证BST中是否存在两个元素且它们的和等于给定的目标结果,由于我们需要取出二叉树中每个节点的值进行判断,那么我们可以借助哈希表。哈希表也叫散列表,是根据键(Key)直接访问在内存存储位置的数据结构。在数据结构中,数组在查找时效率很高,但是插入和删除却很低。而链表刚好反过来。哈希表可以集成链表和数组的优点,在查找、插入、删除时实现 O(1) 的效率。

每次遍历二叉树时,我们把当前节点的值存入哈希表中,然后判断是否在哈希表中存在数值k-root.val。如果存在,则返回true。否则,继续递归判断左子树或右子树中是否存在满足条件的节点,直至到达叶子节点,则返回false

解答

方法一:哈希表

/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {boolean}
 */
function find(root, k, set) {
  if (!root) {
    return false
  }
  if (set.has(k - root.val)) {
    return true
  }
  set.add(root.val)
  return find(root.left, k, set) || find(root.right, k, set) // 递归
}
var findTarget = function(root, k) {
  let set = new Set()
  return find(root, k, set)
}
// 执行用时:84 ms, 在所有 JavaScript 提交中击败了99.25%的用户
// 内存消耗:50.5 MB, 在所有 JavaScript 提交中击败了5.22%的用户

复杂度分析

  • 时间复杂度:O(n),其中 n 是节点的数量。最坏的情况下,整棵树被遍历一次。
  • 空间复杂度:O(n)。最坏的情况下,set 存储 n 个节点的值。

参考