题目
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
数据规模
思路
定义unordered_map<int,int>mp
对数据的val
进行标记。(map<int,int>mp
也是可行的)
首先直接dfs
遍历所有的数据val
,用map
记录每种val
的数量。接下来遍历map
的元素,如果元素it->first
和k-it->first
同时存在就可以直接输出true
,如果找不到就是false
。
注意一种特殊情况:只有一个元素,比如数字
1
1
1,并且k=1
,这时候答案是false
,需要进行特判。
ps:写这个题我才知道我对map
或者unordered_map
的理解有误。比如数据:root = [5,3,6,2,4,null,7]
,mp
中存储了
[
5
,
3
,
6
,
2
,
4
,
7
]
[5,3,6,2,4,7]
[5,3,6,2,4,7],然后我直接使用下标进行访问,比如当前元素迭代器it
,it->first=7
,但是考虑mp[k-it->first]
是否存在,这时候使用下标访问就会导致mp
中存储21
这个数据,但是mp[21]=0
,这样就会修改容器mp
,然后接下来访问mp[21]
,结果发现mp[28-21]=1
,其
7
7
7存在于容器mp
中。所以最好使用find
函数。
代码
// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=1e5+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}
/**
* 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_map<int,int>mp;
void dfs(TreeNode* root){
if(root==nullptr)return ;
mp[root->val]=1;
dfs(root->left);
dfs(root->right);
}
bool findTarget(TreeNode* root, int k) {
dfs(root);
for(auto it=mp.begin();it!=mp.end();it++){
if(mp.find(k-it->first)!=mp.end()&&!(2*it->first==k&&mp.find(k-it->first)->second==1)){
return 1;
}
}
return 0;
}
};