《Algorithms》——删除二叉查找树中的结点

在算法这本书上看到删除BST结点的方法,思考可以发现删除一个只有左子结点或者右子结点的结点是非常容易的,只需要返回它不为空的那个结点即可,但是如果左右结点都不为空就比较麻烦了,因为该结点的父结点只有一个空结点,T.Hibbard在1962年提出了这个算法,大概原理可以归结如下:

1、将指向即将被删除结点的链接保存为t;

2、将x指向他的后继结点min(t.right),后继结点是指t的右子树中最小的结点,这个很好理解,因为只有将这个后继结点作为根结点才能维持树的有序。

3、将x的右链接指向删除后继结点后的右子树。

4、将x的左链接指向t.left

public TreeNode deleteMin(TreeNode x)
{
    if(x.left==null) return x.right;
    x.left=deleteMin(x.left);
    return x;
}
public TreeNode deleteNode(TreeNode x,int key)
{
    if(x==null) return null;
    if(key<x.key) return deleteNode(x.left,key);
    if(key>x.key) return deleteNode(x.right,key);
    else {
        if(x.left==null) return x.right;
        if(x.right==null) return x.left;
        TreeNode t = x;
        x = min(x.right);
        x.left = t.left;
        x.right = deleteMin(t.right);
    }
    return x;

}
public TreeNode min(TreeNode x)
{
    if(x.left==null) return x;
    return min(x.left);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值