二叉查找树

输入一个数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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值