查找 —— 二叉排序树

一、定义

二叉排序树(Binary Sort Tree)或是一棵空树,或满足下列性质的一棵非空的二叉树T:

  1. 如果T的左子树非空,则左子树所有结点值小于T的根值;
  2. 如果T的右子树非空,则右子树所有结点值大于T的根值;
  3. T的左子树和右子树均为二叉排序树。

二、查找关键字

(1)算法思想

在这里插入图片描述
在这里插入图片描述

(2)实现

typeof 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;	//	等于根结点中的关键字,查找成功,返回关键字所在的结点指针
		else if(key<bt->key)
			return BSTsearch(bt->lchild,key);
		else
			return BSTsearch(bt->rchild,key);
	}
}

三、插入关键字

(1)算法思想

在这里插入图片描述
在这里插入图片描述

(2)实现

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

int BSTinsert(BTNode *&bt,int key)	//	因为指针bt要改变,所以要用引用型指针
{
	if(bt==NULL)
	{
		bt=(BTNode*)malloc(sizeof(BTNode));	//	创建新结点
		bt->lchild=bt->lchild=NULL;
		bt->key=key;
		return 1;	//	插入成功,返回1
	}
	else
	{
		if(bt->key==key)
			return -1;	//	等于根结点中的关键字,插入失败,返回-1
		else if(key<bt->key)
			return BSTsearch(bt->lchild,key);
		else
			return BSTsearch(bt->rchild,key);
	}
}

四、二叉排序树的创建

(1)算法思想

在这里插入图片描述
在这里插入图片描述

(2)实现

void CreateBST(BTNode *&bt,int key[],int n)
{
	int i;
	bt=NULL;	//	将树清空
	for(i=0;i<n;i++)
		BSTinsert(bt,key[i]);
}

五、删除关键字的操作

(1)算法思想

当在二叉排序树中删除一个关键字时,不能把以该关键字所在的结点为根的子树都删除,而是只删除这一个结点,并保持二叉排序树的特性。删除结点p的过程分为以下3种情况

1. p结点为叶子结点(若p结点为21)

  • 直接删除即可
    在这里插入图片描述

2. p结点只有右子树而无左子树 ,或者只有左子树而无右子树。(若p结点为56)

  • 此时只需要将p删掉,然后将p的子树直接连接在原来p与其双亲结点f相连的指针上即可。

在这里插入图片描述

3. p结点既有左子树又有右子树。 (若p结点64,此时r结点为56)

  • 沿着p的左子树根结点的右指针一直往右走,直到来到右子树的最右边的一个结点
  • 然后将p中的关键字用r中的关键字代替。
  • 最后判断,如果r是叶子结点,则按照(1)中的方法删除r;如果r是非叶子结点,则按照(2)中的方法删除r。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/starter_____/article/details/93863418