leetcode 算法题653 (简单164) 两数之和 IV - 输入 BST
- 题目介绍
给定一个二叉搜索树和一个目标结果,
如果 BST 中存在两个元素且它们的和等于给定的目标结果,
则返回 true。
- 示例
输入:
5 / \ 3 6 / \ \ 2 4 7
Target = 9
输出: True
输入:
5 / \ 3 6 / \ \ 2 4 7
Target = 28
输出: False
- 解法一
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {boolean}
*/
var findTarget = function(root, k) {
let map = {};
buildMap(root, map);
for(let key in map) {
if(map[k - parseInt(key)]) {
if(k !== parseInt(key) * 2 || map[key] > 1) {
return true;
}
}
}
return false;
};
const buildMap = (node, map) => {
if(!node) {
return;
}
if(map[node.val]) {
map[node.val]++;
} else {
map[node.val] = 1;
}
buildMap(node.left, map);
buildMap(node.right, map);
}
执行用时 : 128 ms, 在所有 JavaScript 提交中击败了63.55%的用户
内存消耗 : 43 MB, 在所有 JavaScript 提交中击败了5.88%的用户
- 解法二
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {boolean}
*/
var findTarget = function(root, k) {
return findTargets(root, new Set(), k);
};
const findTargets = (node, set, k) => {
if(!node) {
return false;
}
if(set.has(k - node.val)) {
return true;
}
set.add(node.val);
return findTargets(node.left, set, k) || findTargets(node.right, set, k);
}
执行用时 : 104 ms, 在所有 JavaScript 提交中击败了99.07%的用户
内存消耗 : 41.2 MB, 在所有 JavaScript 提交中击败了82.358%的用户