二叉搜索树创建过后
就开始查找和删除了
/**任何一个结点的值域都比它的右子树小,比它的左子树大,我们叫它二叉搜索树**/
#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;
}