typedef struct TreeNode Node;
Node *find_max(Node *node){
while(node->right) {
node = node->right;
}
return node;
}
Node *delete_max(Node *node){
if(!node->right) {
Node *ln = node->left;
node->left = NULL;
return ln;
}
node->right = delete_max(node->right);
return node;
}
struct TreeNode* deleteNode(struct TreeNode* root, int key){
if(!root) return NULL;
if(root->val == key){
if(!root->left) {/* 没有左子树,直接将右子树送上去 */
Node *rn = root->right;
free(root);
return rn;
}else if(!root->right){/* 没有右子树,直接将左子树送上去 */
Node *ln = root->left;
free(root);
return ln;
}else{/* 左右子树均存在,情况比较复杂,使用当前节点的前驱替代当前节点 */
/* 寻找当前节点的前驱 */
Node *max = find_max(root->left);
/* 使用前驱替代当前节点 */
max->left = delete_max(root->left);
max->right = root->right;
/* 释放当前节点 */
free(root);
return max;
}
}
if(root->val > key) {
root->left = deleteNode(root->left, key);
return root;
}
root->right = deleteNode(root->right, key);
return root;
}
leetcode-450. 删除二叉搜索树中的节点-C语言
最新推荐文章于 2021-12-10 08:50:12 发布