开启我的LeetCode刷题日记:653. 两数之和 IV - 输入 BST

120 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目: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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/tw… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

采用前序递归,遍历每一个节点,对于每个节点 node,在 set 中检查是否存在 k - node.val。如果存在,那么可以在该树上找到两个节点的和为 k;否则,将 node.val 放入到 set 中,然后对下一个节点进行判断处理

代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {boolean}
 */
var findTarget = function(root, k) {
    let set = new Set()
    var diff = function(node) {
        if (node === null) {
            return false
        }
        if (set.has(k - node.val)) { // 判断是否存在满足条件的值
            return true
        }
        set.add(node.val) // 将节点值存入 set 中
        return diff(node.left) || diff(node.right) // 只要存在 true 即可
    }
    return diff(root)
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹