タイトルアドレス:
https://www.lintcode.com/problem/remove-node-in-binary-search-tree/description
BSTと番号を指定 では、値に等しいノードがBSTで削除され、削除されたルートが返される必要があります。
アイデアは、再帰を使用することです。ツリーのルートが等しくない場合 、次にツリーのルートとのサイズ関係に従って左のサブツリーまたは右のサブツリーを再帰的に削除し、ルートに接続します。それ以外の場合、ツリーのルートが等しい場合 、左と右のサブツリーのいずれかが空の場合、空でないサブツリーのルートを直接返します。それ以外の場合、左と右のサブツリーは空ではないため、左のサブツリーの最大値rootを上書きできます。次に、最大値を削除します。左側のサブツリーの最大値はこのサブツリーの右端になければならず、このノードの右側のサブツリーは空であるため、削除すると非常に便利です。コードは次のとおりです。
public class Solution {
/*
* @param root: The root of the binary search tree.
* @param value: Remove the node with given value.
* @return: The root of the binary search tree after removal.
*/
public TreeNode removeNode(TreeNode root, int value) {
// write your code here
if (root == null) {
return root;
}
if (root.val < value) {
root.right = removeNode(root.right, value);
} else if (root.val > value) {
root.left = removeNode(root.left, value);
} else {
if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
} else {
// 开两个节点,一个节点在前,另一个跟在后面
TreeNode prev, cur;
prev = cur = root.left;
cur = cur.right;
// 如果root的左子树的右子树已经为空了,那么直接把左子树的左子树连到root上即可;
// 否则就删掉左子树的最右端的节点即可
if (cur == null) {
root.val = prev.val;
root.left = prev.left;
} else {
while (cur.right != null) {
cur = cur.right;
prev = prev.right;
}
root.val = cur.val;
prev.right = cur.left;
}
}
}
return root;
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
時空の複雑さ 。