概念:使二叉树变成二叉查找树的性质是,对于树中的每个结点x,它的左子树中所有关键字值小于x的关键字值,而它的右子树中所有关键字的值大于x的关键字值
先序输入
<span style="font-size:14px;">typedef struct bitnode
{
int data;//对于数字的输入注意对于每个数字之间的空格如果是字符的话就不用空格把每个字符分开
struct bitnode* lchild;
struct bitnode* rchild;
}bitnode,*bitree;
void create(bitree &bt)
{
int data;
cin>>data;
if(data==0)
bt=NULL;
else
{
bt=(bitree)malloc(sizeof(bitnode));
bt->data=data;
create(bt->lchild);
create(bt->rchild);
}
}</span><pre name="code" class="cpp">bitree insert(bitree p,int k)
{
if(p==NULL)
{
p=(bitree)malloc(sizeof(bitnode));
p->data=k;
p->lchild=NULL;
p->rchild=NULL;
}
else if(k<p->data)
{
p->lchild=insert(p->lchild,k);
}
else if(k>p->data)
{
p->rchild=insert(p->rchild,k);
}
return p;
}
关键的问题是首先要对是否为空树进行测试,否则会在null上兜圈子
<span style="font-size:14px;">bitree find(bitree bt,int k)//寻找到某一个数值
{
if(bt==NULL)
return NULL;
else if(k<bt->data)
return find(bt->lchild,k);
else if(k>bt->data)
return find(bt->rchild,k);
else
return bt;
}</span>
查找最大最小值
以findmin的递归为例,从根开始并且只要有左儿子就向左进行,终止点是最小的元素
bitree find(bitree bt,int k)//寻找到某一个数值
{
if(bt==NULL)
return NULL;
else if(k<bt->data)
return find(bt->lchild,k);
else if(k>bt->data)
return find(bt->rchild,k);
else
return bt;
}
findmax的非递归算法
bitree findmax(bitree bt)//非递归寻找最大值
{
if(bt!=NULL)
{
while(bt->rchild!=NULL)
{
bt=bt->rchild;
}
}
return bt;
}
插入
重复元的插入可以通过在结点纪录中保留一个附加域
bitree insert(bitree p,int k)
{
if(p==NULL)
{
p=(bitree)malloc(sizeof(bitnode));
p->data=k;
p->lchild=NULL;
p->rchild=NULL;
}
else if(k<p->data)
{
p->lchild=insert(p->lchild,k);
}
else if(k>p->data)
{
p->rchild=insert(p->rchild,k);
}
return p;
}
删除
<span style="font-size:14px;">bitree delete_(bitree &bt,int k)
{
bitree tmpcell; //定义在外面的变量tmcepll
if(bt==NULL)
return bt;
else if(k<bt->data)
bt->lchild=delete_(bt->lchild,k);
else if(k>bt->data)
bt->rchild=delete_(bt->rchild,k);
else if(bt->lchild!=NULL && bt->rchild!=NULL)
{
tmpcell=findmin(bt->rchild);
bt->data=tmpcell->data;
bt->rchild=delete_(bt->rchild,bt->data);
}
else
{
tmpcell=bt;
if(bt->lchild==NULL)
bt=bt->rchild;
else if(bt->rchild==NULL)
bt=bt->lchild;
free(tmpcell);
}
return bt;//每次返回赋值给的是结点的左孩子或者是右孩子
}</span>
/* 6 如何输入带空的树,先序例子 0为空
/ \
2 8
/\ /\
1 4 0 0
/\ /
0 0 3
/\
0 0
*/