交换后继节点
struct TreeNode *find_succ(struct TreeNode *root) {
while (root->left) {
root = root->left;
}
return root;
}
struct TreeNode* deleteNode(struct TreeNode* root, int key){
if (root == NULL) return NULL;
if (root->val > key) {
root->left = deleteNode(root->left, key);
} else if (root->val < key) {
root->right = deleteNode(root->right, key);
} else {
if (root->left == NULL || root->right == NULL) {
struct TreeNode *tmp = root->left ? root->left : root->right;
free(root);
return tmp;
}
struct TreeNode *temp = find_succ(root->right);
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
return root;
}
交换前驱节点
struct TreeNode *find_succ(struct TreeNode *root) {
while (root->right) {
root = root->right;
}
return root;
}
struct TreeNode* deleteNode(struct TreeNode* root, int key){
if (root == NULL) return NULL;
if (root->val > key) {
root->left = deleteNode(root->left, key);
} else if (root->val < key) {
root->right = deleteNode(root->right, key);
} else {
if (root->left == NULL || root->right == NULL) {
struct TreeNode *tmp = root->left ? root->left : root->right;
free(root);
return tmp;
}
struct TreeNode *temp = find_succ(root->left);
root->val = temp->val;
root->left = deleteNode(root->left, temp->val);
}
return root;
}