两数之和 IV - 输入 BST(两数之和要联想到hash)


题目

今天分享一道力扣上的题

给定一个二叉搜索树 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

源自力扣


一、解题思路

一般遇到两数之和类型的题目,通常都会用到hash,记下标的用hashmap,单纯找是否存在的用hashset。

对于一个节点x的值,只需要我们检查哈希表中是否存在k-x即可。 如果可以找到,返回true,否则,把当前值添加到哈希表中。
如果遍历完整棵树都没有找到,即返回false

思路有了,接下来的问题就是如何去遍历了。
方法有很多种,比如前序后序中序层序都可以,选择多多,
这里展示深度优先和前序。

二、代码

1.前序遍历

Dqueu实现的是栈的先进后出
前序依次遍历存在(k-root.val)返回true;否则添加到hashset中。

public boolean findTarget(TreeNode root, int k) {
        Set<Integer> s = new HashSet<>();
        Deque<TreeNode> eq = new LinkedList<>();
        while(!eq.isEmpty()||root!=null){
            while(root!=null){
                eq.push(root);
                if(s.contains(k-root.val)){
                    return true;
                }else{
                    s.add(root.val);
                }
                root=root.left;
            }
            root = eq.pop();
            root =root.right;
        }
        return false;
    }

2.深度优先

class Solution {
    Set<Integer> s = new HashSet<>();
    public boolean findTarget(TreeNode root, int k) {
        if(root==null) return false;
        if(s.contains(k-root.val)) return true;
        else s.add(root.val);
        return findTarget(root.left,k)||findTarget(root.right,k);
    }
}

参考自:力扣官方解析
解析链接
侵删


说句题外话哈,
利用hash表元素不重复的特性
if(s.contains())替换成if(!s.add())也可以哦
不过在我在力扣测试中替换之后执行用时会慢一点
至于是什么原因,有兴趣的小伙伴可以去看看源码哈(看懂了教教我呗哈哈)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值