算法4 二叉查找树deleteMin的理解

算法4 二叉查找树deleteMin的理解

算法四里面的源码有很多值得学习借鉴的地方,我最近读到BST即二叉查找树这个类,里面很多都是利用递归实现,总是认真思考方能领会其中道理。

private Node deleteMin(Node x)这个方法只有四行但是却实现了删除最小的操作,觉得十分精妙。

补充说明一下public的deleteMin()是封装好的方法,本文重点是里面调用的private Node deleteMin(Node x)才是本文主角。

public void deleteMin() {
        if (isEmpty()) throw new NoSuchElementException("Symbol table underflow");
        root = deleteMin(root);
    }

下面是private Node deleteMin(Node x) 代码

 private Node deleteMin(Node x) {
	if (x.left == null) return x.right;
	x.left = deleteMin(x.left);
	x.size = size(x.left) + size(x.right) + 1;
	return	 x;
  }

我们希望删除最小的值,根据二叉搜索树的性质,肯定是希望尽量往左侧走,然后会遇到以下两种情况。

在这里插入图片描述

这个方法对于(1)最左节点恰好为叶节点和(2)最左节点存在右节点两种情况都适用。

(1)最左节点恰好为叶节点:对于最左节点的父节点x调用该方法,x.left = deleteMin(x.left);对于该最左节点又调用该方法,显然最左节点恰好为叶节点时,既没有右子节点也没有左子节点,所以返回的是null,然后上一层的x.left = null,达到了目的;
(2)最左节点存在右节点的情况,deleteMin(w),w.left = deleteMin(w.left),也就是w.left = deleteMin(x).因为二叉查找树性质右边大于左边和父节点,所以此时x是最小值,需用右子节点x1替代x,代码运行if (x.left == null) return x.right,此处x.left 为null,所以deleteMin(x)返回值为x.right即x1,然后把x1赋给w.left,同样达到了目的

我觉得之所以巧妙是因为两种情况都是最左节点为最小值,而且右节点为null和有节点有值可以看作同一种情况,为null相当于是把null当作一种特殊的节点,也赋值给null的父节点。所以,代码可以不需要分类讨论。

以下是算法4二叉查找树更多的源码的补充,以免有朋友不清楚这里Node类是怎样的。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值