bintree

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>

typedef struct bt{
    struct bt * l;
    struct bt * r;
    int v;  
}bt_t;

bt_t * make_node(int v)
{
    bt_t * bt = (bt_t *)(calloc(1,sizeof(bt_t)));
    bt->l = NULL;
    bt->r = NULL;
    bt->v = v;
    return bt;
}

void insert_bt(bt_t ** bt ,int v)
{
    if (NULL == *bt)
    {
        *bt = make_node(v);
    }else 
    {
        if ((*bt)->v >= v)
        {
            insert_bt(&((*bt)->l),v);
        }else 
        {
            insert_bt(&((*bt)->r),v);
        }
    }
}


bt_t * build_bt(int vs[],size_t length)
{
   bt_t * bt = make_node(vs[0]); 
   int i ;
   for (i =1;i<length;i++)
   {
       insert_bt(&bt,vs[i]);
   }
   return bt;
}

bt_t * search_bt(bt_t * bt,int v)
{
    bt_t * ret = NULL;
    if (NULL==bt)
        return ret;
    if (bt->v == v)
    {
        ret = bt;
    }
    else
    {
        ret = search_bt(bt->r,v);
        if (NULL==ret)
        {
            ret = search_bt(bt->l,v);
        }

    }
    return ret;
}

int  delete_bt(bt_t **bt,int v) //在一个函数里修改指针的内容,还是修改指针指向东西的内容。
{
    
    int ret = 0; 
    if (NULL == *bt)
        return ret;
    bt_t *tmp = *bt;
    if ((*bt)->v == v)
    {
        if (NULL != (*bt)->l)
        {
            (*bt) = (*bt)->l;
        }
        else if (NULL != (*bt)->r)
        {
            (*bt) = (*bt)->r;
        }
        else {
            (*bt)= NULL;
        }
        ret = 1; 
        free(tmp);
    }    
    else
    {
           ret = delete_bt(&((*bt)->r),v);
           if (ret == 0)
                ret = delete_bt(&((*bt)->l),v);
    }
    return ret;
}

void change_bt(bt_t * bt,int v,int as)
{
    if(delete_bt(&bt,v)){
       insert_bt(&bt,as); 
    }     
}


void print_pt(bt_t *bt,int blk)
{
    if(NULL == bt)
        return;
    int i;
    for(i=0;i<blk;i++)printf("       "); //深度增加,范围加大
    printf("|—<%d>—|\n", bt->v);
    print_pt(bt->r,blk+1);
    print_pt(bt->l,blk+1);
}


void release_bt(bt_t *bt)
{
    if(NULL == bt)       //功能内聚,代替原来的if(NULL!=bt->l) re..(bt—>l) if(NULL!=bt->r)...
        return;
    release_bt(bt->l);
    release_bt(bt->r);
    free(bt);
    bt=NULL;
}


你可能感兴趣的:(bintree)