一、二叉搜索树的删除
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == nullptr)
return new TreeNode(val);
TreeNode* p = root;
TreeNode* result = root;
while (root != nullptr) {
p = root;
if (val > root->val)
root = root->right;
else
root = root->left;
}
TreeNode* q = new TreeNode(val);
if (p->val > val) {
p->left = q;
} else {
p->right = q;
}
return result;
}
};
二、二叉搜索树的删除
思路:此题二叉搜索树删除较为复杂。关键是递归的返回时直接将节点的父亲节点的指向改变。不用对父亲节点做出保存。
分为五种情况:
1 当没有找到时
2 找到但是为叶子节点
3 左孩子为空,右孩子不为空
4 右孩子为空,左孩子不为空
5 左右孩子都不为空(此种情况需要将找到右节点的最左侧节点,将最左侧节点的left指向删除节点的左子树)
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
TreeNode*cur;
if(root==nullptr)
return nullptr;
if(root->val==key)
{
if(root->left==nullptr&&root->right==nullptr)
return nullptr;
else if(root->left==nullptr&&root->right!=nullptr)
return root->right;
else if(root->left!=nullptr&&root->right==nullptr)
return root->left;
else{
cur=root->right;
while(cur->left!=nullptr)
{
cur=cur->left;
}
cur->left=root->left;
return root->right;
}
}
if(root->val<key)
{
root->right= deleteNode(root->right,key);
}
if(root->val>key)
{
root->left= deleteNode(root->left,key);
}
return root;
}
};