数据结构——二叉查找树

二叉查找树

二叉查找树满足以下条件:
1.左子树上的所有节点值均小于根节点的值;
2.右子树上的所有节点值均大于根节点的值;
3.左右子树也满足上述条件。

二叉查找树的查找操作

这个操作需要返回指向树T中具有关键字X的节点的指针。若节点T中的关键字是X则返回T,若T中的关键字不是X,则对左子树或者右子树递归调用查找操作,若不存在这样的节点则返回NULL。

实现代码如下:
Tree Find(ElemType X,Tree T)
{
    if(T==NULL)
        return NULL;
    if(X > T->data)
        return Find(T->right);
    else if(X < T->data)
        return Find(T->left);
    else
        return T;
}

若是在二叉查找树中寻找最小值或是最大值时只需要从根节点向左子树或者右子树递归就可以。

二叉查找树的插入操作

为了将X插入到树T中,可以像Find那样沿着树查找,如果找到X则什么也不做,如果找不到则将X插入到遍历的路径上的最后一点上。

实现代码如下:
Tree Insert(ElemType X,Tree T)
{
    if(T == NULL)
    {
        T = malloc(sizeof(Tree));
        T->data = X;
        T->left = NULL;
        T->right = NULL;
    }
    esle if(X < T->data)
    {
        T->left = Insert(X,T->left);
    }
    else if(X > T->data)
    {
        T->right = Insert(X,T->right);
    }

    return T;
}

二叉查找树的删除操作

如果节点是一片树叶,那么它可以被立即删除。如果及诶但有一个儿子,则该节点可以在其父节点调整指针绕过该节点后被删除,所删除的节点现在已不再引用,而该节点只有在指向它的指针已被省去的情况下才能被去掉。

复杂的情况是处理具有两个儿子的节点。一般的删除的策略是用其右子树的最小数据代替该节点的数据并递归删除那个节点。因为右子树中的最小节点不可能有左儿子,所以第二次删除要容易。

                 6
               /   \
              2     8
             / \
            1   5
               / 
              3
               \
                4

例如:要删除图中的节点2时,首先用右子树的最小节点 3 代替 2 ,并递归调用函数删除节点 3 。

Tree Delete(ElemType X,Tree T)
{
    Tree tmpCell;
    if(T == NULL)
        Error("X not found");
    else if(X < T->data)
    {
        T->left = Delete(X,T->left);
    }
    else if(X > T->data)
        T->right = Delete(X,T->right);

    else if(T->left && T->right)             //two children
    {
        tmpCell = FindMin(T->right);
        T->data = tmpCell->data;
        T->right = Delete(tmpCell->data,T->right);
    }
    else                        // One or zero child
    {
        tmpCell = T;
        if(T->left == NULL)
            T = T->right;
        else if(T->right == NULL)
            T = T->left;
        free(tmpCell);
    }
    return T;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值