力扣450题如下
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
力扣https://leetcode-cn.com/problems/delete-node-in-a-bst/submissions/
根据二叉搜索树的性质
如果目标节点大于当前节点值,则去右子树中删除;
如果目标节点小于当前节点值,则去左子树中删除;
如果目标节点就是当前节点,分为以下三种情况:
其无左子:其右子顶替其位置,删除了该节点;
其无右子:其左子顶替其位置,删除了该节点;
其左右子节点都有:其左子树转移到其右子树的最左节点的左子树上,然后右子树顶替其位置,由此删除了该节点
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==NULL)return NULL;
if(key<(root->val))root->left=deleteNode(root->left,key);
else if(key>(root->val))root->right=deleteNode(root->right,key);
else{
if(!root->left)return root->right;
else if(!root->right)return root->left;
else{
TreeNode*pre=root;
TreeNode*nex=root->right;
while(nex->left){
pre=nex;
nex=nex->left;
}
root->val=nex->val;
if(pre==root)pre->right=nex->right;
else pre->left=nex->right;
}
}
return root;
}