#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;
}
转载于:https://my.oschina.net/invictuslee/blog/266985