微信改版,加星标不迷路!
每日一算法-两数之和IV-输入BST
作者:阿广
阅读目录
1 题目
2 解析
1 题目
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入: 5 / \ 3 6 / \ \ 2 4 7 Target = 9
输出: True
案例 2:
输入: 5 / \ 3 6 / \ \ 2 4 7 Target = 28
输出: False
2 解析
由于给定的input是bst,采用中序遍历便可以得到由小到大排序的数列(其实解法和哪种遍历没有关系,因为我是采用哈希表来做的),把每次读进来的值判断在哈希表中是否存在k-input_value,如果存在,返回true,否则存到哈希表中。
这里采用了“剪枝”的思想,即如果找到即可返回,不在继续搜索,通过flag标志来判断。
2.1采用中序遍历得到由小到大排序的数列
bool bst(TreeNode* root,int k, set<int>& se){
if(root == NULL){
//...
}
if(se.find(k - root->val) != se.end()){
//...
}
return bst(root->left,k,se) || bst(root->right,k,se);
}
2.2把每次读进来的值判断在哈希表中是否存在k-input_value,如果存在,返回true,否则存到哈希表中。
//如果为空
if(root == NULL){
return false;
}
//如果存在
if(se.find(k - root->val) != se.end()){
return true;
}
//插入保存
se.insert(root->val);
//递归
return bst(root->left,k,se) || bst(root->right,k,se);
完整代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
set<int> se;
return bst(root,k,se);
}
bool bst(TreeNode* root,int k, set<int>& se){
if(root == NULL){
return false;
}
if(se.find(k - root->val) != se.end()){
return true;
}
se.insert(root->val);
return bst(root->left,k,se) || bst(root->right,k,se);
}
};
今日问题
元旦快乐哈!
分析结果和的预期相符吗?
你心中的女神又是谁?
打卡格式:打卡第n天,答:...