Every day a leetcode
解法1:中序遍历+双指针
因为二叉搜索树的中序遍历结果是有序的,所以我们对给定的二叉搜索树中序遍历,将遍历节点的值存储在一个一维数组。
接着,设置两个指针指向有序数组的开头和末尾:
- 当两个指针指向的元素之和小于 k 时,让左指针右移;
- 当两个指针指向的元素之和大于 k 时,让右指针左移;
- 当两个指针指向的元素之和等于 k 时,返回 true 。
最终,当左指针和右指针重合时,树上不存在两个和为 k 的节点,返回 false 。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#define MAX_NODE_SIZE 1e4
void inOrder(struct TreeNode* root,int* node, int* index)
{
if(root == NULL) return;
inOrder(root->left,node,index);
node[(*index)++]=root->val;
inOrder(root->right,node,index);
}
bool findTarget(struct TreeNode* root, int k){
int *node;
node=(int*)malloc(MAX_NODE_SIZE*sizeof(int));
int index=0;
inOrder(root,node,&index);
int left=0;
int right=index-1;
while(left<right)
{
if(node[left]+node[right]>k) right--;
else if(node[left]+node[right]<k) left++;
else return true;
}
free(node);
return false;
}
结果: