LINTCODE——删除二叉查找树的节点
思路:
一、删除的节点无左右节点,直接return NULL;
二、删除的节点只有一个左节点或者右节点,return delNode->left 或者return delNode->right;
三、删除的节点即有左节点也有右节点,则需要:
1、将delNode备份,temp = delNode;
2、delNode指向后继右节点的最小节点,即delNode = minNode(delNode->right);
3、将delNode的right链接到removeNode(temp->right)上;
4、将delNode的left连接点temp的left上;
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 == NULL)
return root;
if(value < root -> val)
root -> left = removeNode(root->left, value);
else if(value > root -> val)
root -> right = removeNode(root->right, value);
else
{
if(root -> right == NULL)
return root -> left;
if(root -> left == NULL)
return root -> right;
TreeNode *temp = root;
root = minNode(root->right);
root -> right = delminNode(temp->right);
root -> left = temp -> left;
}
return root;
}
TreeNode *minNode(TreeNode *root)
{
if(root -> left == NULL)
return root;
return minNode(root -> left);
}
TreeNode *delminNode(TreeNode *root)
{
if(root -> left == NULL)
return root -> right;
root -> left = delminNode(root -> left);
return root;
}
};