二叉搜索树BST(C语言实现可用)

1:概述

搜索树是一种能够进行插入,搜索,删除等操做的数据结构,能够用做字典或优先级队列。二叉搜索树是最简单的搜索树。其左子树的键值<=根节点的键值,右子树的键值>=根节点的键值。数据结构

若是共有n个元素,那么每次操做须要的O(log n)的时间.学习

 

 

 

经常使用知识点spa

  • 满二叉树 : 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特色是每一层上的节点数都是最大节点数。
  • 彻底二叉树 : 而在一棵二叉树中,除最后一层外,若其他层都是满的,而且最后一层要么是满的,要么在右边缺乏连续若干节点,则此二叉树为彻底二叉树。具备n个节点的彻底二叉树的深度为floor(log2n)+1。深度为k的彻底二叉树,至少有2^(k-1)个叶子节点,至多有2^k-1个节点。

2.基本操做

  1. 查找(search)
  2. 插入(insert)
  3. 删除(remove)

3:操做原理

  

查找

假设查找的值为x,从根节点的值开始比对,若是小于根节点的值,则往左儿子继续查找,若是大于根节点的值,则往右儿子继续查找.依次类推.直到当前节点的值等于要查找的值..net

 

  以查找数值10为例code

插入

按照查找的步骤便可找到插入值应该在的位置blog

 

 

以插入数值6为例队列

删除:

有四种状况:rem

1: // 当前节点无左节点 ,右字节点7覆盖5, io

: 3: // 当前节点无右节点 ,右字节点7覆盖5, class

 

 : 4: // 删除节点5的左节点没有右节点, 只须要8做为3的右节点 ,3节点覆盖5

 

 

: 2:  若是以上3中状况都没有,只须要寻找当前节点的左节点的全部字节点的最大值,用最大值填充5节点 4填充5

 

 

 

 

5:完整代码

#include <stdio.h> 
#include <stdlib.h>
struct TNode{
    int data;
    struct TNode *lt;
    struct TNode *rt;    
};
struct TNode* insrtTree(struct TNode *t,int key,int i);
void printTree(struct TNode *root);
struct TNode* delTree(struct TNode* t,int key);
int find(struct TNode* t,int key); 
int arr[1000]={0};
int main(){
    int n,m;
    int i,t;
    scanf("%d%d",&n,&m); 
    struct TNode *root=NULL;
    for(i=0;i<n;i++){
        scanf("%d",&arr[i]); 
        root=insrtTree(root,arr[i],i);
    }
    //t=arr[m-1];
    
    /*
    if(arr[m-1]==0){
        printf("Right child");
    }else{
        printf("Light child");
    }*/
    root=delTree(root,10);
    printTree(root);
    return 0;
}

int find(struct TNode* pt,int key){
    if(pt==NULL)return NULL;
    else if(pt->data==key)return 1;
    else if(pt->data>key) return find(pt->lt,key);
    else if(pt->data<key) return find(pt->rt,key);
}
// 删除节点 
struct TNode* delTree(struct TNode* pt,int key){
    if(pt==NULL)return NULL;
    else if(pt->data>key) pt->lt=delTree(pt->lt,key);//寻找左节点 
    else if(pt->data<key) pt->rt=delTree(pt->rt,key);//寻找右节点
    //  找到节点 处理四种状况  
    else if(pt->lt==NULL){ // 当前节点无左节点 
        struct TNode* curt=pt->rt;
        free(pt);
        return curt;
    }else if(pt->rt==NULL){// 当前节点无右节点 
        struct TNode* curt=pt->lt;
        free(pt);
        return curt;
    }else if(pt->lt->rt==NULL){// 当前节点的左节点无右节点 
        struct TNode* curt=pt->lt;
        curt->rt=pt->rt;
        free(pt);
        return curt;
    }else{ 
    // 以上不知足就把左儿子的子孙中最大的节点, 即右子树的右子树的...右子树, 
    //提到须要删除的节点位置
            struct TNode* p;
            for(p=pt->lt;p->rt->rt!=NULL;p=p->rt);
            struct TNode* curt=p->lt;
            p->rt=curt->rt;
            curt->lt=pt->lt;
            curt->rt=pt->rt;
            free(p);
            return curt;
    }
    return pt;
}
struct TNode* insrtTree(struct TNode *t,int key,int i){
    if(t==NULL){ //处理第一个节点 以及子节点为NULL状况 
        t=(struct TNode*)malloc(sizeof(struct TNode));
        t->lt=t->rt=NULL;
        t->data=key;
        return t;
    }
    if(t->data>key){// 插入左子树状况 
         arr[i]=1;
        t->lt=insrtTree(t->lt,key,i);
    }else{         // 插入右子树状况
        arr[i]=0;
        t->rt=insrtTree(t->rt,key,i);
    }
    return t;
}
void printTree(struct TNode *root){
    if(root==NULL)return;
    printf("%d ",root->data);
    printTree(root->lt);
    printTree(root->rt);
}

 

说明: 自己学习了 https://blog.csdn.net/li_l_il/article/details/88677927 可是完善了代码 

相关文章
相关标签/搜索