剑指 Offer II 056. 二叉搜索树中两个节点之和(dfs + hashTable)

题目

给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。

示例 1:
输入: root = [8,6,10,5,7,9,11], k = 12
输出: true
解释: 节点 5 和节点 7 之和等于 12
示例 2:
输入: root = [8,6,10,5,7,9,11], k = 22
输出: false
解释: 不存在两个节点值之和为 22 的节点
提示:
二叉树的节点个数的范围是 [1, 104].
-104 <= Node.val <= 104
root 为二叉搜索树
-105 <= k <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/opLdQZ

思路

无视二叉搜索树的性质,直接看做普通二叉树。然后深搜遍历二叉树,同时使用哈希表 unordered 来保存唯一的节点值。利用递归每到达一个节点就查找哈希表内有没有值 k - root->val ,如果有则返回 true,否则继续分别遍历左子树和右子树,返回左子右子树的返回值的或,表明一旦有子树中有符合的第二个节点,则此子树返回 true,此子树的父节点也返回 true(因为用了或),直至迭代起始点根节点的返回值为 true。

unodered set<元素类型>
无序集(unorder sets)是一种不按特定顺序存储唯一元素的容器,允许根据元素的值快速检索单个元素。
在unordered_set中,元素的值同时也是唯一标识它的键。键是不可变的,因此,unordered_set中的元素在容器中不能被修改,但是它们可以被插入和删除。
在内部,unordered_set中的元素并不按照任何特定的顺序排序,而是根据它们的散列值组织到桶中,从而允许根据它们的值直接快速访问单个元素(平均时间复杂度为常数)。
与set容器相比,Unordered_set容器通过键访问单个元素的速度更快(哈希表)。

unodered set 容器的属性
关联性
关联容器中的元素是通过它们的键引用的,而不是通过它们在容器中的绝对位置引用的。
无序性
无序容器使用哈希表组织元素,允许通过键快速访问元素。
具有set特性
元素的值也是用来标识它的键。即value就是key。
独一无二的key
容器中没有两个元素具有相同的键。
————————————————
版权声明:本文为CSDN博主「lywmofan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51333606/article/details/123769193

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:

    unordered_set<int> hashTable;

    bool findTarget(TreeNode* root, int k) {
        if(root == nullptr){
            return false;
        }
        if(hashTable.count(k - root->val)){
            return true;
        }
        hashTable.insert(root->val);
        return findTarget(root->left, k) || findTarget(root->right, k);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值