#include <iostream>
using namespace std;
//二叉排序树创建时候并不要求是有序的,如果是有序的将会成单支树(平衡二叉树可以调整)
struct BTN{
int data;
BTN* lchild;
BTN* rchild;
};
//二分搜索
BTN* bsts(BTN* r, int key){
if(r == NULL){
return NULL;
}else{
if(r->data == key){
return r;//返回结点
}
else if(key > r->data){
bsts(r->rchild,key);//关键字大于中间值,去右子树
}
else if(key < r->data){
bsts(r->lchild,key);//关键字小于中间值,去左子树
}
}
}
//插入
int bstInsert(BTN *&r, int ele){//这里传指针的别名是因为要对指针进行修改
//如果在改变指针了本身就要加别名,如果改变的是指针指向的位置并不用加别名
//这里每次递归调用传入的是左子树或者右子树,存的是下一个结点的地址,比如传的是右子树(r->rchild),递归过来也就是 r
//r = cur(cur是新插入的结点),即改变了这个右子树的指针本身,要用别名的方式
if(r == NULL){//如果为空,说明找到要插入的位置
r = new BTN;
r->data = ele;
r->lchild = r->rchild = NULL;
// BTN *cur = new BTN;
// cur->lchild = cur->rchild = NULL;
// r = cur;
return 1;
}else{
if(r->data == ele){//不能插入相同元素
return -1;
}
else if(ele > r->data){
bstInsert(r->rchild,ele);//关键字大于中间值,去右子树
}
else if(ele < r->data){
//这里递归调用,传入的是左子树
bstInsert(r->lchild,ele);//关键字小于中间值,去左子树
}
}
}
//创建
BTN* bstc(int arrs[],int len){
BTN* r = NULL;
for(int i=0; i<len; i++){
bstInsert(r,arrs[i]);
}
return r;
}
int main(){
int arrs[] = {5,3,8,2,7,4};//5 3 8 2 4 7
int len = sizeof(arrs)/sizeof(arrs[0]);
//创建二叉排序树
BTN* r = bstc(arrs,len);
//搜索
BTN* p = bsts(r,3);//binary sorted tree search 搜索
cout<<"p->data: "<<p->data<<" \n"<<"p->lchild->data: "<<p->lchild->data<<" "<<endl;
//插入
bstInsert(r,11);
cout<<"再插一次11:"<<bstInsert(r,3)<<endl;
p = bsts(r,11);
cout<<"插入11:p->data: "<<p->data<<endl;
return 0;
}
来源:CSDN
作者:Dr_W
链接:https://blog.csdn.net/qq_42363032/article/details/103915093