二叉树搜索

 思路篇:【核心】左子树都是比根节点小的,右子树都是比根节点大的,为了更高效的查询

代码示例

#include <stdio.h>
#include <malloc.h>


typedef struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
}TreeNode;

//二叉搜索树
typedef struct BinarySearchTree {
    TreeNode* root;
}BinarySearchTree;

//创建
void  BSTCreate(BinarySearchTree* t){
    t->root=NULL;
}
//删除一个数
void BSTRemove(BinarySearchTree *t,int val);

//销毁一个树,迭代删除所有的数
void BSTDestroy(BinarySearchTree *t){
    while(t->root){
        BSTRemove(t,t->root->val);
    }
}

//要插入的树
TreeNode* insertNode(BinarySearchTree* t,TreeNode* node,int val){
    if(node==NULL){
        TreeNode* tn =(TreeNode *)malloc(sizeof (TreeNode));
        tn->val=val;
        tn->left=NULL;
        tn->right=NULL;
        return  tn;
    }
    if(val < node->val){
        node->left= insertNode(t,node->left,val);
    }else if(val > node->val){
        node->right=insertNode(t,node->right,val);
    }
    return  node;
}

//外部调用函数
void BSTCInsert(BinarySearchTree *t , int value ){
    t->root=insertNode(t,t->root,value);
}

//删除节点
TreeNode  * removeNode(BinarySearchTree *t,TreeNode * node,int value){
   if(node==NULL){
       return NULL;
   }
   if(value<node->val){
       node->left= removeNode(t,node->left,value);
   }else if(value>node->val){
       node->right= removeNode(t,node->right,value);
   }else{
       if(node->left==NULL&&node->right==NULL){
           free(node);
           node=NULL;
           return  NULL;
       }else if(node->left==NULL){
           TreeNode * current = node->right;
           free(node);
           node=current;
           return node;
       } else if(node->right==NULL){
           TreeNode * current = node->left;
           free(node);
           node=current;
           return node;
       }else{
//           左子树和右子树都存在
        TreeNode * current = node->right;
//        递归找他的左子树,最小值
           while (current->left){
               current=current->left;
           }
           node->val=current->val;
           node->right= removeNode(t,node->right,current->val);
       }
   }
    return node;
}

//实际外部调用
void BSTRemove(BinarySearchTree *t,int value){
 t->root= removeNode(t,t->root,value);
}


//查找
int searchNode(BinarySearchTree *t,TreeNode* node,int value){
    if(node==NULL){
        return 0;
    }
    if(value<node->val){
        return searchNode(t,node->left,value);
    }else if(value>node->val){
        return searchNode(t,node->right,value);
    }
//    否则就是相等
    return  1;
}

//提供给外部调用的函数
int BSTSearch(BinarySearchTree *t,int value){
   return searchNode(t,t->root,value);
}

//实现一个中序遍历
void Inorder(BinarySearchTree *t,TreeNode * node){
    if(node){
        Inorder(t,node->left);
        printf("%d",node->val);
        Inorder(t,node->right);
    }
}
//中序遍历的外部调用函数
void BSTInorder(BinarySearchTree *t){
    Inorder(t,t->root);
    printf("\n");
}

int main() {
    BinarySearchTree bst;
    BSTCreate(&bst);
    BSTCInsert(&bst,50);
    BSTCInsert(&bst,30);
    BSTCInsert(&bst,70);
    BSTCInsert(&bst,40);
    BSTCInsert(&bst,80);
    BSTCInsert(&bst,60);
    BSTCInsert(&bst,100);

    BSTInorder(&bst);
    printf("%d\n", BSTSearch(&bst,100));
    printf("%d\n", BSTSearch(&bst,110));

    BSTRemove(&bst,70);
    BSTInorder(&bst);
    BSTCInsert(&bst,50);
    BSTInorder(&bst);

    return 0;
}

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值