【数据结构】二叉搜索树

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

二叉搜索树(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;
}
原文地址:https://www.cnblogs.com/maxwell-maxwill/p/12325288.html