二叉排序树的实现(部分功能

一、何为二叉排序树

二叉排序树可能是空树,或者是存在以下特征的二叉树:

  • 若该树左子树不为空,则左子树上所有记录的关键字均小于根结点所记录的值。
  • 若该树右子树不为空,则右子树上所有记录的关键字均小于根结点所记录的值。
  • 这棵树的左右子树,本身也属于二叉排序树,即左右子树都存在以上两点特征。

二. 编写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.关键字既有左子树,也有右子树。

  • 这里需利用到一个重要概念,即二叉排序树的中序遍历,是有序序列。
  • 找到可替代被删除结点的“东西”,即被删结点的直接前驱或直接后继结点。
posted @ 2020-04-19 16:51  嚯哈哈的霍哈哈  阅读(219)  评论(0编辑  收藏  举报