leetcode 653. 两数之和 IV - 输入 BST

148 阅读1分钟

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);
};