思路:二叉搜索树可以根据值大小确定向左或是向右遍历二叉树方向。
迭代法最重要的是寻找到返回值,传入参数和终止条件。
寻找指定节点并删除分为以下五种情况:
1.没有找到指定节点:
终止并返回值为空
2.寻找到指定节点左右子树都为空:
终止并返回值为空
3.寻找到指定节点其左子树不为空,右子树为空:
终止并返回值为左子树节点
4.寻找到指定节点其右子树不为空,左子树为空:
终止并返回值为右子树节点
5.寻找到指定节点其左右子树都不为空
先将要删除节点的左子树链接到下一个节点的最终左子树上,再将下一个节点返回
具体实现如下:
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr) return nullptr;
if(root->val==key)
{
if(root->left==nullptr&&root->right==nullptr) return nullptr;
else if(root->left&&root->right==nullptr) return root->left;
else if(root->left==nullptr&&root->right) return root->right;
else if(root->left&&root->right)
{
TreeNode* cur=root->right;
while(cur->left!=nullptr)
{
cur=cur->left;
}
cur->left=root->left;
return root->right;
}
}else if(root->val>key) root->left=deleteNode(root->left,key);
else if(root->val<key) root->right=deleteNode(root->right,key);
return root;
}
};