Given a root of Binary Search Tree with unique value for each node. Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.

设找到的需要删除的节点为node
- 如果node是根节点,删除根节点;
- 如果node的右子树为空,直接将node的左子树赋给node的parent节点;
- 如果node的右子树不为空,则需要找一个node的后继(即在右子树中找一个值最小的节点)替换node;
- 如果找不到node则返回root;

技巧:
因为要删除的节点可能是根节点,因此为了算法的通用性,可以首先new一个dummy节点,该节点的左节点指向根节点,这样处理起来更为方便。

/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @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.
*/
TreeNode* removeNode(TreeNode* root, int value) {
// write your code here
if(!root){
return root;
}

TreeNode* dummy =new TreeNode(0);
dummy->left=root;

TreeNode* parent=findNode(dummy,root,value);

TreeNode* node;
if(parent->left && parent->left->val==value){
node=parent->left;
}else if(parent->right && parent->right->val==value){
node=parent->right;
}else{
return dummy->left;//没有找到的情况
}

deleteNode(parent,node);

return dummy->left;
}

TreeNode* findNode(TreeNode* parent,TreeNode* node,int val){

if(node==NULL){
return parent;
}

if(node->val==val){
return parent;
}

if(node->val<val){
return findNode(node,node->right,val);
}else{
return findNode(node,node->left,val);
}
}

void deleteNode(TreeNode* parent,TreeNode* node){

if(node->right==NULL){
if(parent->left==node){
parent->left=node->left;
}else{
parent->right=node->left;
}
}else{
TreeNode* father=node;
TreeNode* minNode=node->right;

while(minNode->left){
father=minNode;
minNode=minNode->left;
}

//这里容易出错
if(father->left==minNode){
father->left=minNode->right;
}else{
father->right=minNode->right;
}


if(parent->left==node){
parent->left=minNode;
}else{
parent->right=minNode;
}

minNode->left=node->left;
minNode->right=node->right;

}

}

};