一、何为二叉排序树
二叉排序树可能是空树,或者是存在以下特征的二叉树:
- 若该树左子树不为空,则左子树上所有记录的关键字均小于根结点所记录的值。
- 若该树右子树不为空,则右子树上所有记录的关键字均小于根结点所记录的值。
- 这棵树的左右子树,本身也属于二叉排序树,即左右子树都存在以上两点特征。
二. 编写SearchBST(T, key)与InsertBST(T, key)的伪代码
1.SearchBST(T, key)伪代码
SearchBST(T, key),即二叉排序树的查找模块,
void SearchBST(BSTree t, int key)//确认树T与查找值KEY的存在
{
if(t==null || k==t->key)//先将key与根节点比较
return t;//若相同,则返回t
else if(key<t)
SearchBST(t->lchild, key);//若第一次比较结果,key比根节点小,从左子树找,最后返回
else
SearchBST(t->rchild, key);//若第一次比较结果,key比根节点大,从右子树找,最后返回
}
2.InsertBST(T, key)伪代码
InsertBST(T, key),即在二叉排序树中的插入模块
二叉排序树的插入操作,可以按照以下思路进行:
- 先检查是不是空树,若为空树,则创建一个结点,结点的值为要插入的值,即key值。
- 若不是空树,则将key值与根结点作比较,之后根据大小进行相应操作。
- key的插入位置,取决于查找不成功的位置,即新插入的结点必为一个新的叶子结点。
void InsertBST(T, key)//确认树T与查找值KEY的存在
{
if(T == null) {//先确定是不是空树
创建一个结点,结点值为key;
申明该树的左右子树都是空树;
return 1;
}
if(T>key){//若key比根结点小,从左子树找
InsertBST(T->lchild,key);
else//若key比根结点大,从右子树找
InsertBST(T->rchild,key);
}
三. 编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST
1.CreateBST(T)伪代码
CreateBST(T),即创建二叉树,创建二叉树主要使用插入模块
- 在建树前先申请空间,同时创建左右子树
typedef struct BSTNode
{
TElemType data;
struct BSTNode *lchild, *rchild;//创建左右子树
}
void CreateBST(T){
先创建一个数组,录入一些结点数据。
if (T == NULL){//树为空
T=new Node;
T->lchild=NULL;
T->rchild=NULL;
return 1;
}
else if(T>data){//若插入的值小于根结点,则从左子树开始插入
return InsertBST(T->lchild,data);
}
else if(T《data){//若插入的值大于根结点,则从右子树开始插入
return InsertBST(T->rchild,data);
}
四. 编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。如果无法编写出来,请写出在BST中删除关键字key所需注意的事项。
1.DeleteBST(T, key)关键要点
DeleteBST(T, key),即删除关键字模块,需注意以下要点:
- 第一步还是要查找关键字,如果找不到,就当什么都没有发生过一样。
- 找到以后,分三种情况来处理,分别是a.关键字是叶子结点;b.关键字只有左子树或只有右子树;c.关键字既有左子树,也有右子树。
- 删除结点并不是单纯的删除,而是用别的“东西”来替代原本的结点。
下面来逐个分析:
a.关键字是叶子结点。
- 将该结点置为空即可,即key=NULL
b.关键字只有左子树或只有右子树。
- 用该结点的左子树or右子树来替换他,即key=key的lchild/rchild
c.关键字既有左子树,也有右子树。
- 这里需利用到一个重要概念,即二叉排序树的中序遍历,是有序序列。
- 找到可替代被删除结点的“东西”,即被删结点的直接前驱或直接后继结点。