Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode 653. 两数之和 IV - 输入 BST
给定一个二叉搜索树 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, 104].
-104 <= Node.val <= 104
root 为二叉搜索树
-105 <= k <= 105
题目分析
根据题意我们需要找出二叉搜索树 root 是否有存在两个元素且它们的和等于给定的目标结果k。俩数之和相信大家都不陌生了吧,刷leetcode的开篇第一题我之前也做过这道题。我作那道题时通过set的方式来优化过代码相信这道题也可以如此。
这道题首先给我们应该二叉搜索树 root ,我们需要从中找出俩值和为k。对与树这种结构天生就适合用递归的方式来解决。
分布实现
定义set对象用于存放我们遍历出的元素,后续通过has方法找出之前存放的值与现在元素的值和为k。
const set = new Set();
定义dfs方法用于递归遍历树,当前元素node不存在时就说明树已经递归完毕了但还是没有找到和为k的俩个值则返回false。
如果通过has方法找出俩值和为k,就直接返回true。没有找到则将此值add到set对象中。
const dfs = node => {
if (!node) return false;
if (set.has(k - node.val)) return true;
set.add(node.val);
return dfs(node.left) || dfs(node.right);
};
代码实现
const findTarget = (root, k) => {
const set = new Set();
const dfs = node => {
if (!node) return false;
if (set.has(k - node.val)) return true;
set.add(node.val);
return dfs(node.left) || dfs(node.right);
};
return dfs(root);
};