题目:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
做题思路:
1.没有找到该节点,直接返回
2.找到该节点
(1)左右节点为空直接删除;
(2)有一个为空,直接继承另一个孩子
(3)都不为空,将左子树接到右子树的最左边,找到右子树的最左子树,因为 二叉搜索树的特点:左边肯定是小于最右边的,那么删除节点的左子树一定小于右子树,那么就得将左子树接到右子树的最左边
struct TreeNode* deleteNode(struct TreeNode* root, int key){
if(root == NULL){
return root;
}else if(root->val == key){
if(root->left == NULL){
return root->right;
}else if(root->right == NULL){
return root->left;
}else{
struct TreeNode* tmp = root->right;
while(tmp->left != NULL){
tmp = tmp->left;
}
tmp->left = root->left;
return root->right;
}
}else if(root->val > key){
root->left = deleteNode(root->left, key);
}else{
root->right = deleteNode(root->right, key);
}
return root;
}