数据结构笔记_36 二叉排序树(删除)

本文详细介绍了如何在二叉排序树中删除节点的三种情况:删除叶子节点、删除只有一个子节点的节点以及删除拥有两个子节点的节点。通过图解和代码演示了查找节点、确定父节点以及具体删除操作的过程,特别强调了删除有两颗子树节点时,寻找右子树最小节点的策略。
摘要由CSDN通过智能技术生成

图解删除二叉排序树节点的三种情况:

在这里插入图片描述
第三种情况中,targetNode 右子树最小的节点刚好满足:大于左子树的所有结点 ,同时小于右子树其他剩余节点。类似的,左子树的最大结点也满足。下面代码取用找右子树的最小结点。

1、第一种情况:删除叶子结点

查找要删除的结点(Node类中):

在这里插入图片描述

查找要删除结点的父节点(Node类中):

这里写的时候出现的bug:其一是,判断当前节点是否是要删除的父节点时,第二个判断语句没有加括号,且this.right.value写成this.value
在这里插入图片描述

简单在BinarySortTree类中封装一下在这里插入图片描述

删除节点:

1)删除叶子结点:

在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

2)删除只有一个结点

因为删除只有一颗子树的结点的判定情况较复杂,所以放在

if 是叶子结点
else if 是有两颗子树的结点
else 只有一颗子树的结点

三段中的else 里面,

这思想叫做必然事件的子事件互斥,三种情况都会发生,除去两个,那第三个必定发生。
在这里插入图片描述

在这里插入图片描述

测试删除结点1.
在这里插入图片描述

3)删除有两颗子树的结点

在这里插入图片描述
先写一个方法:
在这里插入图片描述
再调用一下:
在这里插入图片描述
测试一下:
在这里插入图片描述
在这里插入图片描述

完整代码:

package com.huey.tree;

public class BinarySortTreeDemo {
   

	public static void main(String[] args) {
   

		int[] arr = {
    7, 3, 10, 12, 5, 1, 9, 2 };
		BinarySortTree binarySortTree = new BinarySortTree();
		// 循环的添加结点到二叉排序树
		for (int i = 0; i < arr.length; i++) {
   
			binarySortTree.add(new Node(arr[i]));
		}

		// 中序遍历二叉排序树
		System.out.println("中序遍历二叉排序树~");
		binarySortTree.infixOrder();

		// 测试删除叶子节点
		binarySortTree.delNode(2);
		binarySortTree.delNode(5);
		binarySortTree.delNode(9);
		binarySortTree.delNode(12);
		binarySortTree.delNode(7);
		binarySortTree<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值