首页
学习
活动
专区
工具
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是二叉树中节点的个数。

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

相关·内容

二叉树删除节点

算法: 1.后驱算法: /* 递归解法: 1.找到需要删除节点 2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点..., 或者将右子树的最小节点也就称作后驱当作删除节点。...*/ 2.前驱算法: /* 递归解法: 1.找到需要删除节点 2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点...// 左子树不在的话,表示这个节点就是要删除的最小节点 // 存在两种情况,一:这个节点就是叶子节点,直接通过赋值为nil, 来当作删除节点。...2.删除节点只有右子树或者左子树,直接将右子树或者左子树的根节点当作这个删除节点 3.删除节点左右子树都存在的情况下,左子树的最大节点也叫做前驱当作删除节点, 或者将右子树的最小节点也就称作后驱当作删除节点

76520
  • 排序二叉树-删除节点

    我们已经了解了什么是排序二叉树以及排序二叉树的遍历和添加元素,现在我们一起来看一下,排序二叉树如何删除元素的。...步骤 先找到要删除节点 targetNode 找到要删除节点的父节点 parent 一、删除叶子节点 1.确定 targetNoe 是 parent 的左子节点还是右子节点 2.根据前面的情况来对应删除...parent 的左子节点还是右子节点 3.对应删除 三、删除有两颗子树的节点 1. targetNode 的右子树找到最小的节点 2.用一个临时变量,将最小节点的值保存 temp 3.删除最小节点 4...BinarySortTree1(); for (int i : arr) { binarySortTree.add(new Node(i)); } System.out.println("序遍历二叉树..."); binarySortTree.infixOrder(); binarySortTree.delNode(3); System.out.println("删除之后====序遍历二叉树

    53010

    【DGL系列】remove_nodesgraph删除节点

    ​ 转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 背景说明graph删除节点在dgl中提供了两种形式:dgl.remove_nodes...同时删除相应的特征,节点相连的边也将被移除。删除后,DGL 会使用 ID 0 开始的剩余节点和边重新标记。...store_ids (bool, 可选) – 如果为 True,它将在结果图的 ndata 和 edata 存储提取的节点和边的原始 ID,分别名为 dgl.NID 和 dgl.EID。...删除节点和边后,将使用 0 开始的连续整数重新索引其余节点和边,并保留它们的相对顺序。已删除节点/边缘的特征将相应地移除。...store_ids (bool, 可选) – 如果为 True,它将在结果图的 ndata 和 edata 存储提取的节点和边的原始 ID,分别名为 dgl.NID 和 dgl.EID。

    9610

    Java链表删除节点操作

    this.names = names; this.next = null; } } 2、定义指针类以及构建链表,删除节点方法 /** * 程序目的:定义头结点和尾结点的节点指针,以及建链表方法和删除节点方法...:只要将删除节点的前一个节点指针指向要删除节点的下一个节点即可 else { newNode = first; tmp = first; while (newNode.data...,清除节点,结束输入时输入-1 import java.io.*; import java.util.*; /** * 程序目的:利用链表建立、删除和打印学生成绩 * * @author 86176...要删除的成绩其学号必须在此链表\n"); List.print(); } } } } } 输出: 学号 成绩 学号 成绩 学号 成绩 学号 成绩...要删除的成绩其学号必须在此链表 [1Allen78] [2Scott82] [3Bell78] [4Kobe77] [5Jamse59] [6Jack52] [7Gorge67] [8Yao99]

    1.1K10

    删除链表节点

    题目描述 难度级别:简单 请编写一个函数,使其可以删除某个链表给定的(非末尾)节点。传入函数的唯一参数为 要被删除节点 。...现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:给定你链表中值为 5 的第二个节点...提示: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。...解题思路 题目中待传递给当前函数的实参node,它是链表的某一个待删除节点,然后链表删除这个节点。...这里因为待传入的实参没有完整的链表,所以无法获取到之前节点,所以无法修改前一个节点的next指向。这时需要的是将要删除节点的值替换为它的下一个节点的值,之后要删除这个节点的next指向为下下一项。

    2.4K00

    如何删除Linux用户?

    在本教程,我们将学习如何在Linux组删除用户。我们将使用两种方法,还将展示如何通过从“ / etc / group”文件删除来手动删除用户。...使用usermod删除用户 我们可以使用usermod命令一次从一个或多个组删除一个用户。使用usermod时,您必须指定将用户保留在哪些辅助组。让我用一个示例来解释一下。...与usermod不同,我们使用此命令指定的组删除用户。...(手动) 我们还可以通过手动编辑文件'/ etc / group'删除用户。...: $ groups testuser testuser : testuser root 结论 在本教程,我们学习了如何使用usermod、gpasswd以及“ / etc / group”文件手动删除用户来删除用户

    19.4K20

    如何删除二叉搜索树节点

    递归 递归三部曲: 确定递归函数参数以及返回值 说道递归函数的返回值,在二叉树:搜索树的插入操作通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。...== nullptr) return root; 确定单层递归的逻辑 这里就把平衡二叉树删除节点遇到的情况都搞清楚。...第五种情况有点难以理解,看下面动画: 450.删除二叉搜索树节点 动画中颗二叉搜索树删除元素7, 那么删除节点(元素7)的左孩子就是5,删除节点(元素7)的右子树的最左面节点是元素8。...这里我在介绍一种通用的删除,普通二叉树删除方式(没有使用搜索树的特性,遍历整棵树),用交换值的操作来删除目标节点。...因为二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。 这里我们依然使用递归函数的返回值来完成把节点二叉树移除的操作。

    1.4K30

    2 删除链表节点

    复习链表的插入 链表的一个节点是由数据域和指针域构成,指针域的地址值为下个元素的地址。那么我们需要插入或者删除一个元素怎么处理呢? ? 先查看原始链表结构,准备将结点x插入链表。 ?...1 Leetcode237 删除链表的节点 请编写一个函数,使其可以删除某个链表给定的(非末尾)节点,你将只被给定要求被删除节点。...说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。 先思考一分钟哟! 效果更好哈!...嘿嘿,现在两个结点值1,不管删除哪一个我们都能获得结果,但是第二个节点1我们不方便删除,但是第三个结点1还是轻松的。假设为p指针指向删除节点,那么直接就是p.next=p.next.next。...3 java版本 ?

    1.3K20

    237 删除链表节点

    01 题目信息 题目地址: https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 请编写一个函数,使其可以删除某个链表给定的(非末尾...传入函数的唯一参数为 要被删除节点 。 现有一个链表 -- head = [4,5,1,9],它可以表示为: ?...提示: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。...x) { val = x; } } 现在它传一条链表的一个节点删除这个节点。...值为4的节点是指向5这个节点的,删除5节点就是让4节点直接指向1节点就可以了,但我们拿不到4节点所以不能改变它的next属性的值。那么我们只能改它指向的节点把它的值由5改成1再指向9 ?

    1.3K10

    删除链表的重复节点.

    前言 在一个排序的链表,存在重复的节点如何删除链表重复的节点并返回删除后的链表头指针?例如:1->2->3->3->4->4->5,处理后为: 1->2->5。...那么,我们只需要从第一个元素开始向后比对每个元素,修改节点的指针至不重复的节点,即可完成对重复节点删除。...20220226224625702 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表的重复节点 * @param pHead 链表头节点 */ deleteDuplicatesNode...我们将文章开头所举的例子,代入上述思路,画一下它的递归栈帮助大家更好的理解,如下所示: image-20220228231355965 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表的重复节点...} // 本轮递归结束,第一个与当前节点不同的节点开始递归 return this.deleteDuplicatesNodeForRecursion(pNode); }

    2.8K40

    如何Ubuntu Linux删除Firefox Snap?

    图片如果您想从Ubuntu Linux系统删除Firefox Snap,您可以按照以下步骤进行操作。步骤步骤1:打开终端在Ubuntu Linux系统,您可以使用终端来执行命令。...步骤4:检查Firefox Snap是否已删除要确认Firefox Snap是否已成功删除,请使用以下命令检查系统是否还有Firefox Snap的残留文件:snap list firefox如果没有任何输出结果...,则表示Firefox Snap已从系统完全删除。...您已成功Ubuntu Linux删除了Firefox Snap。现在您可以选择安装其他版本的Firefox浏览器,或者选择使用其他的网络浏览器。...结论通过按照上述步骤,您可以轻松地Ubuntu Linux系统删除Firefox Snap。这样可以帮助您管理您的系统并根据个人需求选择合适的浏览器。

    5K00

    如何 Java 的 List 删除第一个元素

    概述 在这个实例,我们将会演示如何删除Java 定义的 List 的第 1 个元素。...linkedList.add("cow"); linkedList.add("goat"); } ArrayList 根据我们创建的 List,我们来演示在 ArrayList 删除第一个元素...这是因为 ArrayList 在 List 是使用 Array(数组)的,当我们使用删除方法的时候,ArrayList 将会重新将剩余的元素进行拷贝。...结论 在本文中,我们对如何对 List 的第一个元素进行删除进行了说明和讨论。 并且针对 List 接口的 2 个实现来分别了解了不同的时间复杂度。...上面的内容的源代码可以在 java-tutorials/RemoveFirstElementTest.java at master · cwiki-us-docs/java-tutorials · GitHub

    11.5K00
    领券