https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst/
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入:
5
/ \
3 6
/ \ \
2 4 7
Target = 9
输出: True
案例 2:
输入:
5
/ \
3 6
/ \ \
2 4 7
Target = 28
输出: False
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/* 思路
由于是二叉搜索树,所以根据数的性质转化为一个数组(小到大),用前序遍历
头尾相加,判断是否大于目标结果,若大于,则最右边取前一个数,若小于,则取后一个数相加,直到i==j
*/
int count_tree_node(struct TreeNode* root){
if(NULL == root){
return 0;
}
return 1 + count_tree_node(root->left) + count_tree_node(root->right);
}
int i_tree = 0;
void convert_tree_to_arr(int *temp, struct TreeNode* root){
if(NULL == root)
return;
if(NULL != root->left)
convert_tree_to_arr(temp, root->left);
temp[i_tree++] = root->val;
if(NULL != root->right)
convert_tree_to_arr(temp, root->right);
}
bool findTarget(struct TreeNode* root, int k){
// 计算节点个数
int nodenum = 0;
nodenum = count_tree_node(root);
if(nodenum < 2) return false; // 错误判断,必加
// 生成数组
int *temp = (int *)malloc(nodenum * sizeof(int));
convert_tree_to_arr(temp, root);
i_tree = 0;
// 前后遍历
int i = 0;
int j = nodenum - 1;
while(i < j){
int sum = temp[i] + temp[j];
if(sum > k){
j--;
}else if (sum < k){
i++;
}else{
return true;
}
}
return false;
}