二叉搜索树的查找与删除4.12

二叉搜索树创建过后

就开始查找和删除了

/**任何一个结点的值域都比它的右子树小,比它的左子树大,我们叫它二叉搜索树**/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int Ele;
typedef struct Node{
Ele e;
struct Node *left;
struct Node *right;
}*Tree,*TNode;
//
Tree insert(Tree t,Ele e){
if(t==NULL){
t=(TNode)malloc(sizeof(struct Node));
t->e=e;
t->left=NULL;
t->right=NULL;

}else if(t->e>e)
t->left=insert(t->left,e);
else if(t->e<e)
t->right=insert(t->right,e);
//printf("%d\n",t->e);

return t;

}
void print(Tree t,int *n){//n为计算结点数
	if(t){
printf("%d ",t->e );(*n)++;
print(t->left,n);
print(t->right,n);
}
}

int HTree(Tree t){//计算二叉树的高度
int tmp,hl,hr;
if(t==NULL)
return 0;
hl=HTree(t->left);
hr=HTree(t->right);
tmp=hl>hr?hl:hr;
return tmp+1;
}


TNode findmin1(Tree t){//找到二叉树的最小结点
if(!t)
return NULL;
else if(t->left==NULL)
return t;
else 
return findmin1(t->left);//t->left=findmin1(t->left);尾递归都可以变为迭代,如findmin
}





TNode findmin(Tree t){//找到最小结点
if(t){
while(t->left)
	t=t->left;
}
return t;
}

TNode find(Tree t, Ele e){
if(!t)
return NULL;
else if(e<t->e)
return find(t->left,e);
else if(e>t->e)
return find(t->right,e);
esle 
return t;
}
 //2017年04月02日06:36:19
Tree delete(Tree t,Ele e){
	Tree tmp;
	if(t==NULL)
		;
	else if(t->e>e)
		t->left=delete(t->left,e);
	else if(t->e<e)
		t->right=delete(t->right,e);//内层函数的返回值赋给了外层,即它的右子树根节点的地址赋值给了它的右指针
	else{
		       if(t->left!=NULL&&t->right!=NULL)//删除结点有两个孩子
                       {tmp=findmin(t->right);//替换删除
         	        t->e=tmp->e;
         	       t->right=delete(t->right,tmp->e);
                       }
			else{//删除结点有一个孩子或无孩子
                                tmp=t;
                                if(t->left!=NULL)
				{     
					t=t->left;//可能此时t在内层的内层的某个delete函数里,返回左子树
				}
                                else if(t->right!=NULL)
                                {
					t=t->right;	
                               }else(t->left==NULL&&t->right==NULL)
                                  t=NULL;//传值传递不会影响实参指针的指向,作为临时变量用----此层函数返回值为NULL
                              free(tmp);
			}
	}
return t;//返回此树的根结点指针(地址)
}



int main(int argc, char const *argv[])
{

srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
	/* code */

Tree t=NULL;
int  number=0;
for(int i=0;i<2;i++){
number = rand() % 101;  //产生0-100的随机数

t=insert(t,number);

}
int n=0;
print(t,&n);
printf("\n%d\n",n);
	
	printf("树的高度为");
	printf("%d\n", HTree(t));
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值