二叉排序树的查找-插入-删除

二叉排序树的查找-插入-删除
何谓二叉排序树
定义:二叉排序树又称二叉查找树,它或者是一颗空树,或者是具有以下性质的二叉树
1:若它的左子树不空,则左子树上所有节点的值均小于该节点的值。
2:若它的右子树不空,则右字树上所有节点的值均大于该节点的值。
3:它的左右子树也分别为二叉排序树。
时间复杂度:O(h) = log(n) 查找插入以及删除算法时间复杂度均为此
二叉排序树的创建
创建一个二叉排序树,可使用前序创建等,看自己习惯,这里采用前序创建

typedef struct Bitree
{
    char Elem;
    struct Bitree*left;
    struct Bitree*right;
}Bitree;
void CreateBtree(Bitree* &PNode)
{
    char num;
    cin >> num;
    if (num == '#')
        PNode = NULL;
    else
    {
        PNode = new Bitree;
        PNode->Elem = num;
        CreateBtree(PNode->left);
        CreateBtree(PNode->right);
    }
}

二叉排序树的查找
该二叉排序树已排好序,故进行查找时只需沿着一条分支往下走即可查找到该值。

char SearchBT(Bitree*PNode,char key)
if(PNode == NULL)
    return '0';
else if(key == PNode->Elem)
    return PNode->Elem;
else if(key<PNode->Elem)
    return SearchBT(PNode->left);
else
    return SearchBT(PNode->right)

二叉排序树的插入
插入元素至一二叉排序树,原理类似于二叉排序树的查找操作,可先对其进行查找操作,对Key进行查找的过程中即对其位置进行了估计,后可直接对查找到为NULL的前一个节点进行插入操作。

char InsertTree(Bitree *&PNode,char key)
{
    Bitree*FNode, *NodeLeft, *NodeRight;
    //插入操作,本次查找 插入 删除均基于char型进行书写
    if (SearchBST(PNode,FNode,NodeLeft,NodeRight,key) == '0')
    //即待查找元素不在二叉树中
    {
        Bitree *s = new Bitree;
        s->Elem = key;
        s->left = s->right = NULL;
        if (key < FNode->Elem)
            FNode->left = s;
        else
            FNode->right = s;
        Bianli(PNode);
        return '1';
    }
    return '0';
}
char SearchBST(Bitree *&PNode,Bitree *&FNode,Bitree *&NodeLeft,Bitree *&NodeRight,char key)
{
    //PNode:根节点   FNode:代查找节点的父节点  NodeLeft:左孩子节点  NodeRight:右孩子节点
    //查找操作
    if (PNode == NULL)
        return '0';
    if (key == PNode->Elem)
    {
        FNode = PNode;
        return PNode->Elem;
    }
    if (key < PNode->Elem)
    {
        FNode = PNode;
        NodeLeft = PNode->left;
        return SearchBST(PNode->left, FNode, NodeLeft, NodeRight, key);
    }
    else if (key>PNode->Elem)
    {
        FNode = PNode;
        NodeRight = PNode->right;
        return SearchBST(PNode->right, FNode, NodeLeft, NodeRight, key);
    }
}

二叉排序树的删除
二叉排序树的删除操作可分为以下四种情况:
1:待删除节点无左子树亦无右子树,直接删除该节点即可。
2:待删除节点有左子树,无右子树,直接删除该节点,让其父节点指向其左子树节点。
3:待删除节点无左子树,有右子树,直接删除该节点,让其父节点指向其右子树节点。
4:待删除节点有左子树,有右子树,寻找其后继节点,让后继节点值代替该节点后删除后继节点原先指针。

char DeleteBi(Bitree *&PNode)
{
    Bitree *temp;
    if (PNode->left == NULL && PNode->right == NULL)
    {
        //必须将其置空后删除,否则易产生野指针
        PNode = NULL;
        delete PNode;
    }
    else if (PNode->left == NULL && PNode->right != NULL)
    {
        temp = PNode;
        PNode = PNode->right;
        delete temp;
    }

    else if (PNode->left != NULL && PNode->right == NULL)
    {
        temp = PNode;
        PNode = PNode->left;
        delete temp;
    }
    else
    //即待删除节点左右节点均不为空,此时找到该节点的后继节点,用后继节点代替该节点,方便后续红黑树操作
    {
        temp = PNode;
        Bitree *s = PNode->right;
        while (s->left)
        {
            temp = s;
            s = s->left;
        }
        PNode->Elem = s->Elem;
        if (temp != PNode)
            temp->left = s->right;
        else
            temp->right = s->right;
        s = NULL;
        delete(s);
    }
    return '1';
}

至此该二叉排序树基本知识已了解,后续创建二叉树时,可通过创建int型变量代替所提char型变量。
该完整代码在以下链接进行下载:
http://download.csdn.net/download/dream__tt/10112306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值