zoukankan      html  css  js  c++  java
  • 二叉排序树的实现(部分功能

    一、何为二叉排序树

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

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

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

    • 这里需利用到一个重要概念,即二叉排序树的中序遍历,是有序序列。
    • 找到可替代被删除结点的“东西”,即被删结点的直接前驱或直接后继结点。
  • 相关阅读:
    【2021-04-15】台上一分钟,背后十年功
    【2021-04-14】买了人生中的第一个车位
    计算机网络实验部分
    乘积最大子数组
    计算各个位数不同的数字个数
    周总结
    最长回文子序列
    最长回文串
    回文子串
    拼图
  • 原文地址:https://www.cnblogs.com/czrsdsb/p/12731863.html
Copyright © 2011-2022 走看看