主要是分三种情况,叶子节点,有左子树,有右子树。当时有个bug就是在寻找mode的时候是
root->left = deleteNode(root->left, key); 而不是 deleteNode(root->left, key).
class Solution {
public:
int prenodeSearch(TreeNode* root){
root = root->left;
while(root->right) root = root->right;
return root->val;
}
int postnodeSearch(TreeNode* root){
if(root != NULL){
root = root->right;
while(root->left) root = root->left;
return root->val;
}
return -1;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == NULL) return root;
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) {
root = NULL;
}
else if(root->right != NULL){
root->val = postnodeSearch(root);
root->right = deleteNode(root->right, root->val);
}
else{
root->val = prenodeSearch(root);
root->left = deleteNode(root->left, root->val);
}
}
return root;
}
};
本文详细介绍了在二叉搜索树中删除指定键值节点的算法实现,通过三种情况讨论了叶子节点、有左子树及有右子树的处理方式。提供了具体的C++代码实现,包括寻找前驱节点和后继节点的方法。
1168

被折叠的 条评论
为什么被折叠?



