数据结构与算法-二分搜索树节点删除

news2024/11/14 8:23:13

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、二分搜索树的基本概念
      • 二、二分搜索树节点删除的步骤
      • 三、二分搜索树节点删除的实现
        • 1. 二分搜索树节点类
        • 2. 二分搜索树类
        • 3. Java 示例代码
      • 四、总结

引言

二分搜索树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的所有节点的值,且小于其右子树中的所有节点的值。除了常见的插入和查找操作之外,二分搜索树还支持节点的删除。删除节点需要保持二分搜索树的性质不变。本文将深入探讨二分搜索树节点删除的基本原理,并通过具体的Java代码详细说明在二分搜索树中删除节点的实现步骤。

一、二分搜索树的基本概念

二分搜索树是一种特殊的二叉树,具有以下特性:

  1. 左子树:每个节点的左子树中的所有节点的值都小于该节点的值。
  2. 右子树:每个节点的右子树中的所有节点的值都大于该节点的值。
  3. 唯一性:树中不允许存在重复的键值。

二、二分搜索树节点删除的步骤

删除二分搜索树中的节点通常按照以下步骤进行:

  1. 查找节点:找到要删除的节点。
  2. 替换节点:根据节点的不同情况(无子节点、单子节点、双子节点)进行替换或删除。
  3. 调整树:删除节点后,可能需要调整树以保持二分搜索树的性质。
    在这里插入图片描述

三、二分搜索树节点删除的实现

接下来,我们将通过一个示例来详细了解二分搜索树节点删除的实现步骤。

1. 二分搜索树节点类

首先定义二分搜索树的节点类:

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}
2. 二分搜索树类

定义二分搜索树类,实现节点的插入、查找和删除方法:

public class BinarySearchTree {
    private TreeNode root;

    public void insert(int val) {
        root = insert(root, val);
    }

    private TreeNode insert(TreeNode node, int val) {
        if (node == null) {
            return new TreeNode(val);
        }

        if (val < node.val) {
            node.left = insert(node.left, val);
        } else if (val > node.val) {
            node.right = insert(node.right, val);
        }

        return node;
    }

    public TreeNode find(int val) {
        return find(root, val);
    }

    private TreeNode find(TreeNode node, int val) {
        if (node == null || node.val == val) {
            return node;
        }

        if (val < node.val) {
            return find(node.left, val);
        } else {
            return find(node.right, val);
        }
    }

    public void delete(int val) {
        root = delete(root, val);
    }

    private TreeNode delete(TreeNode node, int val) {
        if (node == null) {
            return null;
        }

        if (val < node.val) {
            node.left = delete(node.left, val);
        } else if (val > node.val) {
            node.right = delete(node.right, val);
        } else {
            if (node.left == null) {
                return node.right;
            } else if (node.right == null) {
                return node.left;
            }

            // Node has two children; replace with inorder successor (smallest in the right subtree)
            node.val = findMin(node.right).val;
            node.right = delete(node.right, node.val);
        }

        return node;
    }

    private TreeNode findMin(TreeNode node) {
        while (node.left != null) {
            node = node.left;
        }
        return node;
    }

    public void inorderTraversal() {
        inorderTraversal(root);
    }

    private void inorderTraversal(TreeNode node) {
        if (node != null) {
            inorderTraversal(node.left);
            System.out.print(node.val + " ");
            inorderTraversal(node.right);
        }
    }
}
3. Java 示例代码

创建二分搜索树并删除节点:

public class Main {
    public static void main(String[] args) {
        BinarySearchTree bst = new BinarySearchTree();

        // 插入节点
        bst.insert(5);
        bst.insert(3);
        bst.insert(7);
        bst.insert(4);
        bst.insert(2);

        // 中序遍历显示二分搜索树
        System.out.println("Inorder Traversal before deletion:");
        bst.inorderTraversal();
        System.out.println();

        // 查找节点
        TreeNode foundNode = bst.find(4);
        if (foundNode != null) {
            System.out.println("Found node with value: " + foundNode.val);
        } else {
            System.out.println("Node not found.");
        }

        // 删除节点
        bst.delete(4);

        // 中序遍历显示二分搜索树
        System.out.println("Inorder Traversal after deletion:");
        bst.inorderTraversal();
    }
}

四、总结

二分搜索树是一种非常实用的数据结构,尤其适用于需要频繁查找、插入和删除元素的应用场景。在实际编程中,二分搜索树可以用于实现高效的数据存储和检索,例如在数据库索引、符号表等领域有着广泛的应用。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序
数据结构与算法-归并排序数据结构与算法-归并排序
数据结构与算法-随机快速排序数据结构与算法-随机快速排序
数据结构与算法-双路快速排序数据结构与算法-双路快速排序
数据结构与算法-三路排序数据结构与算法-三路排序
数据结构与算法-关于堆的基本存储介绍数据结构与算法-关于堆的基本存储介绍
数据结构与算法-关于堆的基本排序介绍数据结构与算法-关于堆的基本排序介绍
数据结构与算法-索引堆及其优化数据结构与算法-索引堆及其优化
数据结构与算法-二分搜索树数据结构与算法-二分搜索树
数据结构与算法-二分搜索树链表节点的插入数据结构与算法-二分搜索树链表节点的插入
数据结构与算法-二分搜索树节点的查找数据结构与算法-二分搜索树节点的查找
数据结构与算法-二分搜索树遍历数据结构与算法-二分搜索树遍历
数据结构与算法-二分搜索树层序遍历数据结构与算法-二分搜索树层序遍历

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Unity四种合批技术详解

文章目录 一.静态合批(StaticBatching)1.启用静态合批2.举例说明3.静态合批的限制4.静态合批的优点缺点5.动态指定物品合批 二.动态合批(Dynamic Batching)1.启用动态合批2.合批规则3.举例说明4.使用限制 三.GPU Instancing1.启用GPU Instancing2.启用限制3.举例说明 四.SRP Ba…

构建积极心理学资源站:从零到一的旅程

自己搭建的心理学资源站 积极心理学网站&#xff1a;致力于推动积极未来 欢迎来到kuakua.app&#xff0c;这是一个致力于积极心理学的资源站。 作为一个独立开发者&#xff0c;我与一些热爱心理学的学生合作&#xff0c;创建了这个网站。 我们的目标是通过分享心理学知识和资源…

创新就业政策:智慧校园就业管理的策略之道

在智慧校园的广阔版图中&#xff0c;就业管理板块的“就业政策”功能模块犹如一颗璀璨的明星&#xff0c;照亮着学子们的未来职业道路。它不仅是一座信息的灯塔&#xff0c;指引着学生们穿越就业政策的迷雾&#xff0c;更是一把开启梦想大门的钥匙&#xff0c;帮助他们把握机遇…

2024智慧农场土地租赁家禽认养众筹实时监控商品溯源农业积分商城秒杀助农小程序源码

后端&#xff1a;系统后端使用PHP语言开发 前端&#xff1a;前端使用uniapp进行前后端分离开发 功能简介&#xff1a;土地种植、农业认养、积分商城、农场活动、视频监控、农场商城、实时数据监控、限时秒杀、农业众筹、送货上门、一键分销、农场入驻、全部店铺 运行环境&am…

《Token Contrast for Weakly-Supervised Semantic Segmentation》CVPR2023

摘要(Abstract)&#xff1a; 在弱监督语义分割&#xff08;WSSS&#xff09;中&#xff0c;传统方法通常使用类激活映射&#xff08;CAM&#xff09;生成伪标签&#xff0c;但受限于卷积神经网络&#xff08;CNN&#xff09;的局部结构感知能力&#xff0c;往往难以识别完整的对…

深入分析 Android ContentProvider (十二)

文章目录 深入分析 Android ContentProvider (十二)Android 中 ContentProvider 的系统代码分析&#xff08;续&#xff09;1. ContentProvider 的内部实现机制1.1. ContentProvider 的创建与生命周期管理1.2. ContentProvider 的数据访问与处理1.3. ContentProvider 的权限管理…

Node Red 与axios简易测试环境的搭建

为了学习在vue3中如何使用axios&#xff0c;我借Sider Fusion的帮助搭建了基于node的简易测试环境。 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;通常用于浏览器环境&#xff0c;但它也可以在 Node.js 环境中使用。因此&#xff0c;可以在 Ubuntu 的 Bash 环境下通过…

NPDP|传统行业产品大神都是怎样管理产品的?

在传统行业中&#xff0c;产品管理不仅是技术的较量&#xff0c;更是策略、洞察力和执行力的综合体现。那些被誉为“产品大神”的经理们&#xff0c;他们如何管理产品&#xff0c;使其在市场上脱颖而出&#xff0c;成为行业内的佼佼者&#xff1f;本文将探讨他们的一些关键管理…

触发邮件接口如何与现有CRM系统无缝集成?

触发邮件接口的性能优化策略&#xff1f;如何设计高效的API接口&#xff1f; 随着企业对自动化和个性化沟通需求的增加&#xff0c;触发邮件接口的集成变得尤为重要。AokSend将探讨触发邮件接口如何与现有CRM系统无缝集成&#xff0c;以及这种集成带来的优势和挑战。 触发邮件…

c语言第七天笔记

作业题&#xff1a; 设计TVM&#xff08;地铁自动售票机&#xff09;机软件。 输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0…

与树莓派的“黄金”关系,是如何帮助这家医疗设备公司扩大规模

稳定的供应和与Raspberry Pi的“黄金”关系帮助医疗设备公司进行了规模扩张 埃及医疗设备制造商Bio Business需要将物联网功能集成到其成功的患者监测设备系列中。Raspberry Pi技术使他们得以实现。 解决方案 RP2040 Compute Module 4 企业规模 中小企业 行业 医疗技术 …

springbootJZ车行系统-计算机毕业设计源码93812

目 录 摘 要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流…

Java语聊大厅语音聊天小程序系统源码

语聊大厅语音聊天小程序&#xff1a;遇见声音的温暖角落 &#x1f3a7; 【初识语聊大厅&#xff0c;声音的奇妙邂逅】 在这个快节奏的时代&#xff0c;你是否渴望一份不被视线束缚的真诚交流&#xff1f;语聊大厅语音聊天小程序&#xff0c;就是你我之间最温柔的桥梁。轻轻一…

禅道项目管理软件安装教程

一、禅道软件简介 禅道项目管理软件是一款国产开源项目管理软件。它集项目集管理、产品管理、项目管理、质量管理、DevOps、知识库、BI效能、工作流、学堂、反馈管理、组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整覆盖了研发项目管理的…

提升Windows录屏体验:3款顶级电脑录屏软件推荐!

Hey&#xff01;伙伴们&#xff0c;是不是有时候会觉得需要录屏呢&#xff1f;比如做个教学视频啦、直播玩游戏啦&#xff0c;或者是把重要的会议内容记录下来。这时候有一款好的电脑录屏软件简直不要太棒&#xff01;作为你们身边的科技小能手&#xff0c;今天我就来给大家安利…

vue2前端监听usb

在 Vue2 前端应用中监听 USB 设备的插入和拔出事件&#xff0c;可以使用浏览器提供的 WebUSB API。这需要运行在支持 WebUSB API 的浏览器上&#xff0c;并且用户需要授予相应的权限。 以下是一个示例&#xff0c;展示如何在 Vue2 项目中监听 USB 设备的插入和拔出事件。 1. …

【practise】string_atoi

今天来分享一道比较平常的练习题&#xff0c;说实话我自己写了半天&#xff0c;自己写的很烂最后还是看的答案… 1.题目概要 题目链接&#xff1a;LINK 2.题目难点 这个题目有两个难点&#xff0c;如下&#xff1a; 拿到了全部都是数字字符的字符串&#xff0c;怎么将这个…

新160个crackme - 019-Acid Bytes.3

运行分析 需要破解Name和Serial PE分析 upx壳 linux系统&#xff1a;upx -d CrackMe3.exe 脱壳发现是Delphi系统&#xff0c;32位 静态分析&动态调试 找到关键字符串&#xff0c;进入关键函数 静态分析&#xff0c;发现了Name和Serial明文 验证成功

深入理解 Git `git add -p` 命令中的交互选项

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

2 路模拟量转 Lora模块(开关量,0-10V,4-20ma)

一、功能概述 本产品是一款无线中继器&#xff0c;将 0~ 10V 电压信号转为无线信号&#xff0c; 通过无线方式远传&#xff0c;实现远程通信功能。采用 Lora 无线通信技术&#xff0c; 工作中心频率 433M&#xff0c;空旷传输距离 7000 米。点对点电流远传&#xff0c;用无 线…