给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 输出: True
案例 2:
输入: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 输出: False
思路:
由于给定的input是bst,采用中序遍历便可以得到由小到大排序的数列(其实解法和哪种遍历没有关系,因为我是采用哈希表来做的),把每次读进来的值判断在哈希表中是否存在k-input_value,如果存在,返回true,否则存到哈希表中。
这里采用了“剪枝”的思想,即如果找到即可返回,不在继续搜索,通过flag标志来判断。
void findTargetCore(TreeNode* root, int k, unordered_set<int> &sset, bool &flag) {
if (flag) {
return;
}
if (!root) {
return;
}
findTargetCore(root->left, k, sset, flag);
if (flag) {
return;
}
if (sset.count(k - root->val) != 0) {
flag = true;
return;
}
else {
sset.insert(root->val);
}
findTargetCore(root->right, k, sset, flag);
if (flag) {
return;
}
}
bool findTarget(TreeNode* root, int k) {
if (!root) {
return false;
}
unordered_set<int> sset;
bool flag = false;
findTargetCore(root, k, sset, flag);
return flag;
}