[LintCode]Remove Node in Binary Search Tree
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
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.
*/
private TreeNode lastNode;
private TreeNode targetNode;
private boolean findNode(TreeNode root, int value) {
while (root != null) {
if (root.val < value) {
lastNode = root;
root = root.right;
} else if (root.val > value) {
lastNode = root;
root = root.left;
} else {
targetNode = root;
return true;// find it
}
}
return false;
}
private void deleteNode() {
if (targetNode.left != null && targetNode.right != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.left;
} else {
lastNode.right = targetNode.left;
}
TreeNode temp = targetNode.left;
while (temp.right != null) {
temp = temp.right;
}
temp.right = targetNode.right;
} else if (targetNode.left != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.left;
} else {
lastNode.right = targetNode.left;
}
} else if (targetNode.right != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.right;
} else {
lastNode.right = targetNode.right;
}
} else {
if (lastNode.left == targetNode) {
lastNode.left = null;
} else {
lastNode.right = null;
}
}
}
public TreeNode removeNode(TreeNode root, int value) {
// 2015-3-30
if (root == null) {
return root;
}
TreeNode dummy = new TreeNode(0);
dummy.left = root;
// do not find it and do nothing
if (!findNode(root, value)) {
return root;
}
if (lastNode == null) {
lastNode = dummy;
}
deleteNode();
return dummy.left;
}
}
// 遇到删除节点的题,一定要考虑,被删除的节点是不是根节点,使用dummyNode
// 使用lastNode时,一定要考虑会不会为空指针
// 待改进