#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//递归实现
bool BST_insert(BiTree T,ElemType key){
if(T->data==-1){//第一个结点还未插入新元素
T->data=key;
return true;
}
if(T->data==key){//递归结束条件
return false;
}
//递归终止时找到插入位置再分配空间
else if(key<T->data&&T->lchild==NULL){ //递归结束条件
T->lchild = (BiTNode *)malloc(sizeof(BiTNode));
T->lchild->data = key;
T->lchild->lchild = T->lchild->rchild = NULL;
return true;
}
else if(key>T->data&&T->rchild==NULL){//递归结束条件
T->rchild = (BiTNode *)malloc(sizeof(BiTNode));
T->rchild->data = key;
T->rchild->lchild= T->rchild->rchild = NULL;
return true;
}
//往下层递归
else if(key<T->lchild)//此时T->lchild一定存在
BST_insert(T->lchild,key);
else if(key>T->rchild)//此时T->rchild一定存在
BST_insert(T->rchild,key);
}
bool BST_insert2(BiTree T,ElemType key){
if(T->data==-1){//第一个结点还未插入新元素
T->data=key;
return true;
}
BiTNode *p=T;//p用来遍历二叉树
while(p!=NULL){//大前提保证指针不断 这种方法有问题,但分指树
if(key==p->data){
return false;
}
if(key < p->data){
if(p->lchild==NULL){//找到插入位置
p->lchild = (BiTNode *)malloc(sizeof(BiTNode));
p->lchild->data = key;
p->lchild->lchild = p->lchild->rchild = NULL;
return true;
}
p = p->lchild;//保证了p->lchild存在
}
else if(key>p->data){
if(p->rchild==NULL){//找到插入位置
p->rchild = (BiTNode *)malloc(sizeof(BiTNode));
p->rchild->data = key;
p->rchild->lchild= p->rchild->rchild = NULL;
return true;
}
p = p->rchild;
}
}//while
}
//查找非递归实现
BiTNode *BST_Find(BiTree T,ElemType key){
//非递归
/*while(T!=NULL){
if(T->data==key)
return T;
else if(T->data<key)
T = T->lchild;
else
T = T->rchild;
}
return T;//查找失败返回空 */
while(T!=NULL&&key!=T->data){
if(T->data<key)
T = T->rchild;
else if(T->data>key)
T = T->lchild;
}
return T;
}
//递归实现
BiTNode *BST_Find2(BiTree FindT,ElemType key){
if(FindT==NULL)
return FindT;
else if(FindT->data==key)
return FindT;
else if(FindT->data>key)
BST_Find2(FindT->lchild,key);
else
BST_Find2(FindT->rchild,key);
}
void Creat_BST(BiTree *T){
*T = (BiTree)malloc(sizeof(BiTNode));//建立头结点便于操作
}
void out_put(BiTree T){
if(T!=NULL){//中序遍历得到递增序列
out_put(T->lchild);
printf("%d,",T->data);
out_put(T->rchild);
}
}
void main(){
BiTree T;
int str[]={53,17,65,87,23,9,45,78};
int n=sizeof(str)/sizeof(int);
Creat_BST(&T);//使用创建函数是为了先创建一个结点是指针有明确指向,便于后面的指针传递处理
T->data=-1;//可以给第一个结点赋一个特殊值,使插入函数区分第一个结点是否已插入数据
T->lchild = T->rchild=NULL;
for(int i=0;i<n;i++){
BST_insert(T,str[i]);//第一个结点已存在 ,可
}
}
二叉排序树BST的插入、查找实现(递归和非递归)
最新推荐文章于 2024-07-25 08:55:54 发布