【Leetcode653】二叉搜索树中两个节点之和(基础题,dfs+哈希)

一、题目描述

在这里插入图片描述

二、方法

基础题,二叉树版本的两数之和,dfs遍历这棵二叉搜索树,比如当前节点数值为val,那么就查哈希表key为k - val的键值对是否存在,如果存在则显然说明存在题目说的两个节点,如果不存在不能直接说明没这样的节点(因为可能这对节点才刚出现一个),而是存入该哈希表后继续遍历二叉树。实现中可以用集合set代替哈希表HashMap,速度会快一丢丢。

三、代码

java版本:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    
    
    //哈希set
    Set<Integer> set = new HashSet<Integer>();
    
    public boolean findTarget(TreeNode root, int k) {
    
    
        if(root == null){
    
    
            return false;
        }
        if(set.contains(k - root.val)){
    
    
            return true;
        }
        //如果set中没有(k-root)元素,则把root值加入到哈希set中
        set.add(root.val);
        return findTarget(root.left, k) || findTarget(root.right, k);
    }
}

C++版本:

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

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/126908063