给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
TreeNode *deleteNode(TreeNode *root, int key){
//如果root为空
if (!root) {
return nullptr;
}
if (key < root->val) {//如果就是在root的左子树 那就删除左子树
root->left = deleteNode(root->left, key);
}else if(key > root->val){//如果就是在root的右子树 那就删除右子树
root->right = deleteNode(root->right, key);
}else{
if (!root->left && !root->right) { //如果是叶子节点就返回空
return nullptr;
}else if(root->left){ //如果当前节点有左子树那么有该找到左子树中最大的元素
auto large = root->left;
while (large->right) {
large = large->right;
}
//交换再删除
swap(root->val, large->val);
root->left = deleteNode(root->left, key);
}else if(root->right){ //当前结点还有右子树
auto small = root->right;
//需要从右子树中找到最小的结点
while (small->left) {
small = small->left;
}
//交换再删除
swap(root->val, small->val);
root->right = deleteNode(root->right, key);
}
}
return root;
}