代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

文档讲解:
BST,各种插入删除操作

235.二叉搜索树的最近公共祖先

思路:昨天练习了二叉树的搜索,今天这道题是二叉搜索树的搜索,其具有有序这个特点,其能决定我们每次搜索是进入该节点的左子树还是右子树,而且其具有一个特点,一旦要搜索的节点p和节点q不存在同一个子树中,那么此时的root一定是他们两个的最近公共祖先!
时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    TreeNode* traversal(TreeNode* root,TreeNode* p,TreeNode* q)
    {
        if(root==nullptr)return root;
        //只要p和q分别存在于该root的两棵子树中的时候,就可以返回了
        if(root->val>p->val&&root->val>q->val)
        {
            TreeNode* lefttree=traversal(root->left,p,q);
            //出栈,回到最上面一层
            if(lefttree!=nullptr)
            {
                return lefttree;
            }
        }
        if(root->val<p->val&&root->val<q->val)
        {
            TreeNode* righttree=traversal(root->right,p,q);
            if(righttree!=nullptr)
            {
                return righttree;
            }
        }
        return root;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return traversal(root,p,q);
    }
};

701.二叉搜索树中的插入操作

思路:其实这道题看起来复杂,做起来容易,就是无论如何,我们都将要插入的节点,插入到最后一个位置,每次只需要比较其比根节点大还是小,放在左子树还是右子树!
时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    TreeNode* traversal(TreeNode* root,int val)
    {
        if(root==nullptr)
        {
            TreeNode* node=new TreeNode(val);
            return node;
        }
        if(val<root->val)
        {
            root->left=traversal(root->left,val);
        }
        if(val>root->val)
        {
            root->right=traversal(root->right,val);
        }
        return root;
    }
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        return traversal(root,val);
    }
};

450.删除二叉搜索树中的节点

思路:这里的调整树的结构还得学习一下!
时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr)return root;
        if(root->val==key)
        {
            if(root->left==nullptr&&root->right==nullptr)
            {
                delete root;
                return nullptr;
            }
            if(root->left==nullptr&&root->right)
            {
                TreeNode* temp=root;
                root=root->right;
                delete temp;
                return root;
            }
            else if(root->left&&root->right==nullptr)
            {
                TreeNode* temp=root;
                root=root->left;
                delete temp;
                return root;
            }
            else
            {
                TreeNode* cur=root->right;
                while(cur->left!=nullptr)
                {
                    cur=cur->left;
                }
                cur->left=root->left;
                TreeNode* temp=root;
                root=root->right;
                delete temp;
                temp=nullptr;
            }
        }
        if(root->val>key)root->left=deleteNode(root->left,key);
        if(root->val<key)root->right=deleteNode(root->right,key);
        return root;
    }
};

你可能感兴趣的:(算法,数据结构)