删除二叉搜索树中的一个结点
有3种情况:
该结点
1.没有儿子
2.有一个儿子
3.有两个儿子
前两种比较简单,第三种可以选择左子树的最大结点或者右子树的最小结点来顶替该结点,占据该结点位置。
我们本着先找到待删除结点,再分情况讨论的原则。
struct Node* Delete(Node* root, int data) {
if (root == NULL)
return root;
else if (root->data > data)
root->left = Delete(root->left, data);
else if(root->data < data)
root->right = Delete(root->right, data);
else {
//找到待删除结点,分情况讨论
}
}
下面是函数完整代码
struct Node* Delete(Node* root, int data) {
if (root == NULL)
return root;
else if (root->data > data)
root->left = Delete(root->left, data);
else if(root->data < data)
root->right = Delete(root->right, data);
else {
//找到待删除结点,分情况讨论
//no child,one child,two children
if (root->left == root->right == NULL) {
delete root;//释放空间
root = NULL;
}
else if (!root->left) {
//显然,我们需要释放内存
struct Node* temp = root;
root = root->right;
delete temp;
}
else if (!root->right) {
struct Node* temp = root;
root = root->left;
delete temp;
}
else {//有两个孩子,这里我们找右子树中的最小值
struct Node* temp = FindMin(root->right);
root->data = temp->data;
root->right = Delete(root->right, temp->data);
}
}
}
找右子树最小值
Node* FindMin(Node*root) {
if (!root)
return NULL;
while (root->left) {
root=root->left;
}
return root;
}