Two Sum IV - Input is a BST
题目
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target.
Example 1:
Input:
5
/ \
3 6
/ \ \
2 4 7
Target = 9
Output: True
Example 2:
Input:
5
/ \
3 6
/ \ \
2 4 7
Target = 28
Output: False
解决
给定的二叉树是二叉搜索树,而二叉搜索树的特点是左子节点的value
< 父节点的value
< 右子节点的value
。
而前序遍历二叉搜索树,将节点的value
一个个加进数组中,最后得到的数组是从小到大排好序的数组。
遍历数组,有两个指针i
和j
,i = 0, j = array.size() - 1
,两个指针向中间靠拢:
- 若
array[i] + array[j] > Target
,说明array[j]
太大了,则j--
- 若
array[i] + array[j] < Target
,说明array[i]
太小了,则i++
- 若
array[i] + array[j] == Target
,则返回true
- 若
i == j
,则证明遍历数组之后还没有找到匹配对,则返回false
/**
* 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) {
if (root == NULL) {
return false;
}
vector<int> value;
stack<TreeNode*> tree;
TreeNode* temp = root;
while (!tree.empty() || temp != NULL) {
while (temp != NULL) {
tree.push(temp);
temp = temp->left;
}
temp = tree.top();
tree.pop();
value.push_back(temp->val);
temp = temp->right;
}
int i = 0;
int j = value.size() - 1;
while (i < j) {
if (value[i] + value[j] == k) {
return true;
} else if (value[i] + value[j] < k) {
i++;
} else {
j--;
}
}
return false;
}
};