###### tags: `Leetcode` `easy` `tree` `hash` `python` `c++`
# 653. Two Sum IV - Input is a BST
## [題目連結:] https://leetcode.com/problems/two-sum-iv-input-is-a-bst/
## 題目:
Given the ```root``` of a Binary Search Tree and a target number ```k```, return ```true``` if there exist two elements in the ```BST``` such that their sum is equal to the given target.
#### [圖片來源] https://leetcode.com/problems/two-sum-iv-input-is-a-bst/
## 解題想法:
* 題目為給一BST,求任兩點val和等於target k
* 使用字典存
* key:root.val
* val:target-root.val
* dfs遍歷所有點,判斷該key之val是否同時為key存在字典中
* 注意,應需在dfs同時,即進行判斷
* **不能dfs跑完紀錄所有組合到dic後,再統一判斷,會error**
* ex: 特殊情況root=[4],k=8, 應該是False
* 因為只有一點 dic[4]=4
* 但同時此val=4也為key,判斷上會出錯
## Python:
``` python=
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insertLeft(self,node):
if self.left==None:
self.left=TreeNode(node)
else:
self.left.insertLeft(node)
def insertRight(self,node):
if self.right==None:
self.right=TreeNode(node)
else:
self.right.insertRight(node)
def printTree(self):
root=self
stack=[root]
res=[]
while stack:
root=stack.pop(0)
res.append(root.val)
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
print(res)
class Solution(object):
def findTarget(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: bool
"""
#dfs遍歷所有node
self.dic={} #key:root.val val:target-root.val
self.res=False
self.dfs(root,k)
return self.res
def dfs(self,root,k):
if not root:
return
if k-root.val in self.dic:
self.res=True
return
self.dic[root.val]=k-root.val
self.dfs(root.left,k)
self.dfs(root.right,k)
if __name__=='__main__':
root=TreeNode(1)
result=Solution()
ans=result.findTarget(root,2)
print(ans) #False
```
## C++:
``` cpp=
#include<iostream>
#include<queue>
#include<vector>
#include<unordered_map>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(): val(0), left(nullptr), right(nullptr){}
TreeNode(int x): val(x), left(nullptr), right(nullptr){}
};
void InsertLeft(TreeNode* root, int data){
TreeNode *tmp=root;
if (tmp->left!=nullptr)
InsertLeft(tmp->left,data);
else{
TreeNode *new_data= new TreeNode(data);
tmp->left=new_data;
}
}
void InsertRight(TreeNode* root, int data){
TreeNode *tmp=root;
if (tmp->right!=nullptr)
InsertRight(tmp->right,data);
else{
TreeNode *new_data= new TreeNode(data);
tmp->right=new_data;
}
}
void PrintTree(TreeNode *root){
TreeNode *tmp=root;
queue<TreeNode*> que;
vector<int> res;
que.push(root);
while (!que.empty()){
TreeNode *root=que.front(); que.pop();
res.push_back(root->val);
if (root->left)
que.push(root->left);
if (root->right)
que.push(root->right);
}
for (auto val: res){
cout<<val<<" ";
}
cout<<endl;
}
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
unordered_map<int,int> dic;
dfs(root, k, dic);
return res;
}
void dfs(TreeNode*root, int k, unordered_map<int,int>& dic){
if (root==nullptr)
return ;
//find
if (dic.find(k-root->val)!=dic.end()){
res=true;
return ;
}
else
dic[root->val]=k-root->val;
dfs(root->left, k, dic);
dfs(root->right, k ,dic);
}
private:
bool res=false;
};
int main(){
TreeNode *root=new TreeNode(5);
InsertLeft(root,3);
InsertRight(root,6);
InsertLeft(root->left,2);
InsertRight(root->left,4);
InsertRight(root->right,7);
Solution res;
bool ans=res.findTarget(root,9);
cout<<ans<<endl;
return 0;
}
```