• 【数据结构】二叉搜索树


    查找问题:静态查找动态查找

    二叉搜索树(Binary Search Tree, BST)

    1. 定义
      二叉搜索树,又称为二叉排序树或二叉查找树
      二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
      (1)非空左子树的所有键值小于其根结点的键值
      (2)非空右子树的所有键值大雨其根结点的键值
      (3)左、右子树都是二叉搜索树

    2. 二叉搜索树的特别函数
      Position Find(ElementType X, BinTree BST)
      Position FindMin(Bintree BST)
      Position FindMax(Bintree BST)

    Position Find(ElementType X, BinTree BST){
        if(!BST) return NULL;
        if(X>BST->Data)
            return Find(X,BinTree->Right);
        if(X<Bst->Data)
            return Find(X,BinTree->Left);
        else
            return BST;
    }
    

    尾递归都可以用循环迭代来实现

    Position Find(ElementType X, BinTree BST){
        BinTree TmpTree=BST;
        while(!TmpTree){
            if(X>TmpTree->Data)
                TmpTree=TmpTree->Right;
            if(X<TmpTree->Data)
                TmpTree=TmpTree->Left;
            else
                return TmpTree;
        }
        return NULL;
    }
    

    查找的效率取决于树的高度

    递归求最小元素

    Position FinMin(BinTree BST){
         if(!BST) return NULL;
         else if(!BST->Left)
            return BST;
         else
            return FindMin(BST->Left)  
    }
    

    迭代求最小元素

    Position FinMin(BinTree BST){
        BinTree BT=BST;
        if(BT==NULL) return NULL;
        else{
            while(!(BT->Left)) BT=BT->Left;
            return BT;
        }
    }
    

    二叉搜索树的插入

    分析:关键是要找到元素应该插入的位置,可以采用与Find类似的方法

    BinTree Insert(ElementType X,BinTree BST){
        if(!BST){
            BST=malloc(sizeof(struct TreeNode));
            BST->Data=Element;
            BST->Left=BST->Right=NULL;
        }
        else
            if(X<BST->Data)
                BST->Left = Insert(X,BST->Left);
                BST->Right = Insert(X,BST->Right);
        return BST;
    }
    

    二叉搜索树的删除

    三种情况:
    要删除叶结点:直接删除,在修改其父结点指针——置为NULL
    要删除的结点只有一个孩子:将其父结点的指针指向要删除结点的孩子结点
    要删除的结点有左、右两棵子树:用另一结点替代被删除的结点:右子树的最小元素或左子树的最大元素

    BinTree Delete(ElementType X,BinTree BST){
        Position Tmp;
        if(!BST) printf("要删除的元素未找到");
        else if(X<BST->Data)
            BST->Left=Delete(X,BST->Left);
        else if(X>BST->Data)
            BST->Right=Delete(X,BST->Right);
        else
            if(BST->Left&&BST->Right){
                Tmp = FindMin(BST->Right);
                BST->Data=Tmp->Data;
                BST->Right=Delete(BST->Data,BST->Right);
            }else{
                Tmp BST;
                if(!BST->Left)
                    BST=BST->Right;
                else if(!BST->Right)
                    BST=BST->Left;
                free(Tmp);
            }
         return BST;
    }
    
  • 相关阅读:
    css知识点
    javascript 中闭包
    javascript 继承方法总结
    css滚动滚轮事件
    关于闭包的总结
    xpth xslt
    好的js函数
    自动化测试实施(4)
    自动化测试实施(5)
    自动化测试实施(3)
  • 原文地址:https://www.cnblogs.com/maxwell-maxwill/p/12325288.html
Copyright © 2020-2023  润新知