给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。
样例
给出如下二叉查找树:
5
/ \
3 6
/ \
2 4
删除节点3之后,你可以返回:
5
/ \
2 6
\
4
或者:
5
/ \
4 6
/
2
/**
* 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
TreeNode *p = root;
bool found = false;
TreeNode *parent = NULL;
TreeNode *result = root;
while (p != NULL)
{
if (p->val == value)
{
found = true;
break;
}
else if (p->val < value)
{
parent = p;
p = p->right;
}
else
{
parent = p;
p = p->left;
}
}
if (found)
{
TreeNode *left = p->left;
TreeNode *right = p->right;
if (right == NULL)
{
if (parent == NULL)
{
result = left;
}
else
{
if (p->val < parent->val)
{
parent->left = left;
}
else
{
parent->right = left;
}
}
}
else
{
TreeNode *q = right;
while (q->left != NULL)
{
q = q->left;
}
q->left = left;
if (parent == NULL)
{
result = right;
}
else
{
if (p->val < parent->val)
{
parent->left = right;
}
else
{
parent->right = right;
}
}
}
delete p;
}
return result;
}
};