题目
272. 最接近的二叉搜索树值 II
思路
先将二叉树的中序遍历列出来,再利用二分法查找最接近的值。
具体题目272题+代码
给定一个不为空的二叉搜索树和一个目标值 target,请在该二叉搜索树中找到最接近目标值 target 的 k 个值。
注意:
给定的目标值 target 是一个浮点数
你可以默认 k 值永远是有效的,即 k ≤ 总结点数
题目保证该二叉搜索树中只会存在一种 k 个值集合最接近目标值
示例:
输入: root = [4,2,5,1,3],目标值 = 3.714286,且 k = 2
4
/
2 5
/
1 3
输出: [4,3]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-binary-search-tree-value-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define ABS(a) ((a) > 0 ? (a):(-(a)))
void CreatArray(struct TreeNode* root, int* list, int* len)
{
if (root == NULL) {
return;
}
if (root->left != NULL) {
CreatArray(root->left, list, len);
}
list[*len] = root->val;
(*len)++;
if (root->right != NULL) {
CreatArray(root->right, list, len);
}
}
int* closestKValues(struct TreeNode* root, double target, int k, int* returnSize){
int* arrayList = (int*)malloc(sizeof(int) * 10000);
int arrayLen = 0;
int* out = (int*)malloc(sizeof(int) * k);
* returnSize = 0;
CreatArray(root, arrayList, &arrayLen);
int i, j, mid;
i = 0;
j = arrayLen - 1;
while (i < j - 1) {
mid = (i + j) / 2;
if (ABS(target - arrayList[mid]) < 0.01) {
i = j = mid;
break;
} else if (target < arrayList[mid]) {
j = mid;
} else {
i = mid;
}
}
while (k > 0) {
if (i == j) {
out[* returnSize] = arrayList[i];
(* returnSize)++;
k--;i--;j++;
continue;
}
if (i >= 0 && j <= arrayLen - 1) {
if (ABS(target - arrayList[i]) < ABS(target - arrayList[j])) {
out[* returnSize] = arrayList[i];
(* returnSize)++;
k--;i--;
} else {
out[* returnSize] = arrayList[j];
(* returnSize)++;
k--;j++;
}
} else if (i >= 0) {
out[* returnSize] = arrayList[i];
(* returnSize)++;
k--;i--;
} else {
out[* returnSize] = arrayList[j];
(* returnSize)++;
k--;j++;
}
}
return out;
}