📅  最后修改于: 2023-12-03 15:12:36.430000             🧑  作者: Mango
这是 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 的节点进行删除操作。这里我们可以使用递归的方式进行遍历。
删除节点时需要考虑以下情况:
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)。