📜  门| GATE CS 2018 |第 36 题(1)

📅  最后修改于: 2023-12-03 15:12:36.430000             🧑  作者: Mango

门 | GATE CS 2018 | 第 36 题

这是 GATE CS 2018 的第 36 题,考察的是二叉搜索树的操作。

题目描述

给定一个二叉搜索树(BST)的根节点和一个整数 K,要求删除 BST 中所有值为 K 的节点,并返回修改后的 BST 的根节点。如果 BST 中没有值为 K 的节点,则返回原始的根节点。

示例

输入:

     5
    / \
   3   7
  / \ / \
 2  4 6  8

删除值为 3 的节点后,应该返回以下二叉树:

     5
    / \
   4   7
  /   / \
 2   6   8
解题思路

要删除 BST 中所有值为 K 的节点,我们需要遍历整颗 BST,找到所有值为 K 的节点进行删除操作。这里我们可以使用递归的方式进行遍历。

删除节点时需要考虑以下情况:

  • 当前节点为 null:返回 null。
  • 当前节点的值等于 K:删除该节点,返回该节点的子树合并后的根节点。
  • 当前节点的值小于 K:在当前节点的右子树中递归查找值为 K 的节点,并替换当前节点的右子树。
  • 当前节点的值大于 K:在当前节点的左子树中递归查找值为 K 的节点,并替换当前节点的左子树。
代码实现
class Node {
    int val;
    Node left, right;

    Node(int val) {
        this.val = val;
        this.left = this.right = null;
    }
}

public class DeleteKFromBST {
    public Node deleteNode(Node root, int k) {
        if (root == null) {
            return null;
        }
        if (root.val == k) {
            root = merge(root.left, root.right);
        } else if (root.val < k) {
            root.right = deleteNode(root.right, k);
        } else {
            root.left = deleteNode(root.left, k);
        }
        return root;
    }

    private Node merge(Node left, Node right) {
        if (left == null) {
            return right;
        }
        if (right == null) {
            return left;
        }

        Node rightMost = getRightMost(left);
        rightMost.right = right;

        return left;
    }

    private Node getRightMost(Node node) {
        while (node.right != null) {
            node = node.right;
        }
        return node;
    }
}

以上是本题的 Java 代码实现。

代码时间复杂度为 O(log n),空间复杂度为 O(1)。