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

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

相关·内容

16分43秒

60-尚硅谷-Scala数据结构和算法-二叉树节点删除

5分7秒

61-尚硅谷-Scala数据结构和算法-二叉树节点删除扩展提示

16分21秒

098-尚硅谷-图解Java数据结构和算法-二叉树删除结点思路图解

26分17秒

099-尚硅谷-图解Java数据结构和算法-二叉树删除结点代码实现

16分21秒

098-尚硅谷-图解Java数据结构和算法-二叉树删除结点思路图解

26分17秒

099-尚硅谷-图解Java数据结构和算法-二叉树删除结点代码实现

6分53秒

Java零基础-178-java中如何自定义异常

8分30秒

092-尚硅谷-图解Java数据结构和算法-前序中序后序遍历二叉树图解

8分30秒

092-尚硅谷-图解Java数据结构和算法-前序中序后序遍历二叉树图解

18分23秒

020-尚硅谷-图解Java数据结构和算法-单链表节点的删除和小结

18分23秒

020-尚硅谷-图解Java数据结构和算法-单链表节点的删除和小结

7分30秒

day17_项目三/20-尚硅谷-Java语言基础-项目三TeamView中删除开发团队成员

领券