首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从二叉树中删除节点(Java)

从二叉树中删除节点的过程可以分为三种情况:

  1. 删除的节点是叶子节点:直接将该节点删除即可。
  2. 删除的节点只有一个子节点:将该节点的子节点替代该节点的位置。
  3. 删除的节点有两个子节点:需要找到该节点的后继节点(即右子树中最小的节点)或者前驱节点(即左子树中最大的节点)来替代该节点。后继节点或前驱节点可以通过以下两种方式找到:
  4. a. 后继节点:找到该节点右子树中的最小节点,即一直往左子树走直到叶子节点。
  5. b. 前驱节点:找到该节点左子树中的最大节点,即一直往右子树走直到叶子节点。

删除节点的具体步骤如下:

  1. 如果根节点为空,则直接返回。
  2. 如果待删除节点的值小于当前节点的值,则递归地在左子树中删除该节点。
  3. 如果待删除节点的值大于当前节点的值,则递归地在右子树中删除该节点。
  4. 如果待删除节点的值等于当前节点的值,则执行删除操作:
  5. a. 如果待删除节点是叶子节点或者只有一个子节点,则直接删除该节点。
  6. b. 如果待删除节点有两个子节点,则找到后继节点或前驱节点来替代该节点,并递归地在后继节点或前驱节点所在的子树中删除后继节点或前驱节点。

下面是一个示例的Java代码实现:

代码语言:txt
复制
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTree {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) {
            return null;
        }

        if (key < root.val) {
            root.left = deleteNode(root.left, key);
        } else if (key > root.val) {
            root.right = deleteNode(root.right, key);
        } else {
            if (root.left == null && root.right == null) {
                root = null;
            } else if (root.right != null) {
                root.val = successor(root);
                root.right = deleteNode(root.right, root.val);
            } else {
                root.val = predecessor(root);
                root.left = deleteNode(root.left, root.val);
            }
        }

        return root;
    }

    private int successor(TreeNode root) {
        root = root.right;
        while (root.left != null) {
            root = root.left;
        }
        return root.val;
    }

    private int predecessor(TreeNode root) {
        root = root.left;
        while (root.right != null) {
            root = root.right;
        }
        return root.val;
    }
}

这段代码实现了从二叉树中删除节点的功能。在删除节点时,根据节点的值与当前节点的值的比较,递归地在左子树或右子树中删除节点。如果待删除节点是叶子节点或者只有一个子节点,则直接删除该节点。如果待删除节点有两个子节点,则找到后继节点或前驱节点来替代该节点,并递归地在后继节点或前驱节点所在的子树中删除后继节点或前驱节点。

这个算法的时间复杂度为O(logN)到O(N),其中N是二叉树中节点的个数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

共29个视频
【动力节点】JDBC核心技术精讲视频教程-jdbc基础教程
动力节点Java培训
本套视频教程中讲解了Java语言如何连接数据库,对数据库中的数据进行增删改查操作,适合于已经学习过Java编程基础以及数据库的同学。Java教程中阐述了接口在开发中的真正作用,JDBC规范制定的背景,JDBC编程六部曲,JDBC事务,JDBC批处理,SQL注入,行级锁等。
共50个视频
MySQL数据库入门到精通(外加34道作业题)(上)
动力节点Java培训
本套是MySQL数据库视频教程是动力节点教学总监杜老师讲述,其中详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看本套Java视频教程就可掌握MySQL全套知识。
共45个视频
MySQL数据库入门到精通(外加34道作业题)(下)
动力节点Java培训
本套是MySQL数据库视频教程是动力节点教学总监杜老师讲述,其中详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如何安装MySQL及MySQL新特性,通过观看本套Java视频教程就可掌握MySQL全套知识。
共22个视频
JavaWeb阶段入门教程-EL表达式+JSP【动力节点
动力节点Java培训
通过本课程的学习,使大家掌握JSP开发,充分认知JSP在实际项目开发中的重要作用。 jsp从表现上看更像是前端组件,只是传统的html代码加入了java脚本的综合操作。但是在本质上,jsp同时又是servlet。
共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-1
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-2
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共50个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-3
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共18个视频
动力节点-【CRM客户管理系统】SSM框架项目实战教程-4
动力节点Java培训
这套教程是动力节点最新录制的CRM项目,课程主要针对核心的客户关系管理业务功能进行实现,让你能够深层掌握主流SSM框架、Linux操作系统下部署项目、数据库设计原则和技巧、数据如何通过图表在页面展示、Java对excel文件的处理,学会使用项目管理工具Maven、版本控制工具Git,以及缓存在项目中的运用熟悉前端开发技术及常见的特效等。 通过课程可以了解项目开发流程及项目开发各阶段主要文档及产出物
共0个视频
【纪录片】中国数据库前世今生
TVP官方团队
【中国数据库前世今生】系列纪录片,将与大家一同穿越时空,回顾中国数据库50年发展历程中的重要时刻,以及这些时刻如何塑造了今天的数据库技术格局。通过五期节目,讲述中国数据库从1980s~2020s期间,五个年代的演变趋势,以及这些大趋势下鲜为人知的小故事,希望能为数据库从业者、IT 行业工作者乃至对科技历史感兴趣的普通观众带来启发,以古喻今。
领券