输入一个数data,从二叉查找树找到一个节点node,要求满足| node->value - data | 绝对值最小.
#include<stdio.h>
#include<stdlib.h>#include<math.h>
struct BinTree{
struct BinTree *left;
struct BinTree *right;
int value;
};
typedef struct BinTree BTree;
BTree *insertTree(BTree *root, int data){
BTree *newNode = (BTree *)malloc(sizeof(struct BinTree));
newNode->left = NULL;
newNode->right = NULL;
newNode->value = data;
if(root == NULL)
return newNode;
else{
BTree *temp = root;
BTree *parent;
while(temp != NULL){
parent = temp;
if(data < temp->value)
temp = temp->left;
else
temp = temp->right;
}
if(data < parent->value)
parent->left = newNode;
else
parent->right = newNode;
}
return root;
}
BTree *create(int array[], int length){
BTree *root = NULL;
int i;
for(i = 0; i < length; i++)
root = insertTree(root, array[i]);
return root;
}
void midTraverse(BTree *root){
if(root != NULL){
midTraverse(root->left);
printf("%d ", root->value);
midTraverse(root->right);
}
}
BTree *findMinDiff(BTree *root, int data){
if(root == NULL) return NULL;
BTree *temp = root;
int MIN = abs(temp->value - data);
BTree *findNode = temp;
while(temp != NULL){
int diff = abs(temp->value - data);
if(diff < MIN){
MIN = diff;
findNode = temp;
}
if(data < temp->value)
temp = temp->left;
else if(data > temp->value)
temp = temp->right;
else if(data == temp->value)
return temp;
}
return findNode;
}
int main(){
int array[] = {9, 14, 5, 18, 8, 6, 4, 12};
BTree *root = create(array, 8);
midTraverse(root);
int data = 7;
BTree *minNode = findMinDiff(root, data);
if(minNode == NULL) printf("\nThe tree is NULL\n");
else printf("\nGot it! your input is %d, its nearest value = %d, |%d - %d| = %d\n", data, minNode->value, minNode->value, data, abs(minNode->value - data));
return 0;
}
5595

被折叠的 条评论
为什么被折叠?



