常用的数据结构之二叉排序树

首先先理解二叉排序树的定义。二叉排序树满足以下三个性质:

1,若它的左子树不为空,则其左子树上的所有关键字的值均小于根关键字上的值。

2,若它的右子树不为空,则右子树上所有关键字的值均大于根关键字上的值。

3,左右子树又是一颗二叉排序树。

二叉排序树通常用二叉链表来存储的。

 typedef struct BTNode{
	
	int key;
	struct BTNode *lchild;
	struct BTNode *rchild;
}BTNode;

二叉排序树 的查找算法。其实其思想与折半查找差不多,通过先比较当前的根节点,若是大于当前的根节点,则继续查找其右子树。若是小于当前的根节点,则查找其左子树。如果查到了,则证明查找成功。反之如果查到了空节点,则说明了查找失败。以下是算法代码:

BTNode * BSTSearch(BTNode *bt,int key){
	if(bt==null)
	return NUll;//查找失败,返回空。 
	else {
		if(bt->key==key){
			return bt;//找到了key值,则返回其节点的位置 
		}
		else {
			if(bt->key>key)//如果大于key值,则去其左子树上查找 
			return BSTSearch(bt->lchild,key);
			else
			return BSTSearch(bt->rchild,key); //反之去右子树上查找。 
		}
	}	
}

对于插入的操作,也是基于查找操作进行的:

int BSTNodeInsert(BTNode * &bt,int key){//注意这里应是传引用,因为是插入操作,当插入成功时,原先空节点要进行赋值。如果不是传引用,那么当 调用的函数结束后,bt进行销毁,相当于没插 
	
	
	if(bt==NULL){
		bt->key=key;
		bt->lchild=NULL;
		bt->rchild=NULL; 
		return 1;//插入成功返回1 
	}
	else{
		
		if(bt->key==key){
			return 0;//已存在,则插入失败 
		}
		else{
			
			if(bt->key>key){
				return BSTNodeInsert(bt->lchild,key);
			}
			else{
				return BSTNodeInsert(bt->rchild,key);
			}
		}
	}
} 

建立一个二叉排序树,建立一个二叉排序树,相当于从一个空节点开始插入。话不多说,上代码:

void BSTNodeBuild(BTNode *& bt,int key[],int n){
	bt=NULL;
	for(int i=0;i<n;i++){
		bt->key=key[i];//先创立待插的节点 
		BTNodeInsert(bt,key[i]);//调用插入节点 的操作。 
	}	
} 
发布了50 篇原创文章 · 获赞 13 · 访问量 8837

猜你喜欢

转载自blog.csdn.net/weixin_43770577/article/details/90082431