二叉排序树的创建

被刻印的时光 ゝ 提交于 2020-01-20 07:56:10

在这里插入图片描述

#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;
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!