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

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

题目链接:二叉搜索树的最近公共祖先

思路

因为二叉搜索树是有序的,因此pq的最近公共祖先一定在两者之间,所以每到一个节点,该节点的数值如果大于pq,则朝左子树走;如果小于pq,则朝右子树走;如果在两者之间,则返回该节点。

class Solution {
public:
    TreeNode* traversal(TreeNode* cur, TreeNode*p, TreeNode* q){
        if(cur == nullptr) return cur;
        if(cur->val > p->val && cur->val > q->val){
            TreeNode* left = traversal(cur->left, p, q);
            if(left != nullptr){
                return left;
            }
        }
        if(cur->val < p->val && cur->val < q->val){
            TreeNode* right = traversal(cur->right, p, q);
            if(right != nullptr){
                return right;
            }
        }
        return cur;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return traversal(root, p, q);
    }
};

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

题目链接:二叉搜索树中的插入操作

思路

这道题目思路比较清晰,将val与每个节点的值进行比较,大了朝右,小了朝左。最终总可以找到一个叶子节点存放这个val

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

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

题目链接:删除二叉搜索树中的节点

思路

删除二叉搜搜树种的节点有五种情况:

  1. 没有找到删除的节点
  2. 删除的节点是叶子节点,左右都为空
  3. 左为空,右不为空
  4. 左不为空,右为空
  5. 左右都不为空

情况2:直接删除叶子节点即可;情况3:让父节点指向它的右子树;情况4:让父节点指向它的左子树;情况5:让父节点指向它的右子树,同时将它的左子树移动到右子树下。

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;
            }

            else if(root->left == nullptr){
                TreeNode* node = root->right;
                delete root;
                return node;
            }
            else if(root->right == nullptr){
                TreeNode* node = root->left;
                delete root;
                return node;
            }
            else{
                TreeNode* cur = root->right;
                while(cur->left != nullptr){
                    cur = cur->left;
                }
                cur->left = root->left;
                TreeNode* tmp = root;
                root = root->right;
                delete tmp;
                return root;
            }
        }

        if(root->val > key) {
            root->left = deleteNode(root->left, key);
        }
        if(root->val < key){
            root->right = deleteNode(root->right, key);
        }
        return root;
    }
};

参考链接

  1. https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E6%80%9D%E8%B7%AF

你可能感兴趣的:(算法学习,算法)