二叉搜索树

二叉搜索树(Binary Search Tree)也称作二叉排序树。二叉搜索树或者是一棵空树,或者是具有以下性质的二叉树:

(1)若它的左子树不为空,则左子树上所有的节点值小于它的根节点的值

(2)若它的右子树不为空,则右子树上所有的节点值大于它的根节点的值

(3)它的左右子树也是二叉搜索树

二叉搜索树的插入算法:

if 树为空

把新节点赋值给根节点

else 

如果新值小于当前节点的值:

把新值插入到当前节点的左子树

如果新值大于当前节点的值:

把新值插入到当前节点的右子树

否则:error


删除算法:

if树为空

error;

eles

如果删除的节点没有孩子,直接free

如果删除的节点有一个孩子,则把该节点的双亲节点和该节点的孩子节点连接起来

如果删除的节点有两个孩子,则把右子树中最小的节点,复制给待删除节点,最后将右子树中最小的节点删除掉。



#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define type int


typedef struct tnode{
type data;
struct tnode* left;
struct tnode* right;
}tnode,*ptrnode;


ptrnode bst_insert(type x,ptrnode proot);


ptrnode bst_find(type x,ptrnode proot);


ptrnode bst_delete(type x,ptrnode proot);


void bst_midprint(ptrnode proot);

ptrnode findmin(ptrnode proot);


int main()
{


struct tnode * root=NULL;
root=bst_insert(20,root);
root=bst_insert(12,root);
root=bst_insert(25,root);
root=bst_insert(5,root);
root=bst_insert(16,root);
bst_midprint(root);
printf("\n---------------------------\n");
printf("look up for:%d\n",bst_find(10,root)==NULL?-1:bst_find(20,root)->data);
printf("\n---------------------------\n");
root=bst_delete(12,root);
bst_midprint(root);
printf("\n");
return 0;
}


ptrnode findmin(ptrnode proot)
{
if(proot==NULL)
return NULL;
else if(proot->left==NULL)
return proot;
else
return findmin(proot->left);
}

/*ptrnode bst_insert(type x,ptrnode proot)   //递归实现
{
ptrnode cur;
if(proot==NULL){
cur=(ptrnode)malloc(sizeof(struct tnode));
cur->data=x;
cur->left=cur->right=NULL;
proot=cur;
}
else{
assert(proot->data!=x);
if(proot->data>x)
proot->left=bst_insert(x,proot->left);
else
proot->right=bst_insert(x,proot->right);
}


return proot;
}*/


ptrnode bst_insert(type x,ptrnode proot)//非递归实现
{
ptrnode pre;
ptrnode cur;
ptrnode newd;
if(proot==NULL){
cur=(ptrnode)malloc(sizeof(struct tnode));
assert(cur!=NULL);
cur->data=x;
cur->left=cur->right=NULL;
proot=cur;
}
else{
pre=proot;
cur=proot;
while(cur!=NULL){
pre=cur;
if(x>cur->data){
cur=cur->right;}
else{
assert(cur->data!=x);
cur=cur->left;
}


}
newd=(ptrnode)malloc(sizeof(struct tnode));
assert(newd!=NULL);
newd->data=x;
newd->left=newd->right=NULL;
if(x<pre->data)
pre->left=newd;
else
pre->right=newd;


}


return proot;
}


void bst_midprint(ptrnode proot)
{
if(proot!=NULL)
{
bst_midprint(proot->left);
printf("%d ",proot->data);
bst_midprint(proot->right);
}
}


ptrnode bst_find(type x,ptrnode proot)
{
ptrnode cur;
assert(proot!=NULL);
cur=proot;
while(cur!=NULL&&x!=cur->data){
if(x< cur->data)
cur=cur->left;
else
cur=cur->right;
}
return cur;
}




ptrnode bst_delete(type x,ptrnode proot)
{
ptrnode cur;
assert(proot!=NULL);
if(x<proot->data)
proot->left=bst_delete(x,proot->left);
else if(x>proot->data)
proot->right=bst_delete(x,proot->right);
else if(proot->left&&proot->right)
{
cur=findmin(proot->right);
proot->data=cur->data;
proot->right=bst_delete(proot->data,proot->right);
}
else
{
cur=proot;
if(proot->left==NULL)
proot=proot->right;
else if(proot->right==NULL)
proot=proot->right;


free(cur);
}
return proot;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值