给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
思路:先根据二叉搜索树的性质,找到要删除的节点。若该节点没有右子树,直接用该节点的左子树代替该节点;若该节点没有左子树,直接用该节点的右子树代替该节点。若节点既有左子树又有右子树,把节点的左子树作为右子树的最左子树的左子树;也可以把节点的右子树作为左子树的最右子树的右子树。看上去有点绕,多理解一下
TreeNode* deleteNode(TreeNode* root, int key) {
if(!root)return nullptr;
if(key<root->val)root->left=deleteNode(root->left,key);
else if(key>root->val)root->right=deleteNode(root->right,key);
else{
if(!root->right)
return root->left;
if(!root->left)
return root->right;
TreeNode* r=root->right;
//找到右子树的最左子树
while(r->left)r=r->left;
r->left=root->left;
root=root->right;
}
return root;
}