「这是我参与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 个节点的值。