Bootstrap

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

代码随想录算法训练营第二十四天

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

题目链接:235. 二叉搜索树的最近公共祖先
从根节点向下搜索,如果当前节点数值大于p和q证明需要在左子树范围内搜索;如果当前节点数值都小于p和q,需要在整个右子树中寻找,找到在p和q之间的节点,就是最近的公共祖先节点。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

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

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

题目链接:701.二叉搜索树中的插入操作
大了往左找,小了往右找,将要插入的节点放到最后的叶子节点,不用调整树的结构。

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

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

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

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr)return nullptr;
        if(root->val>key){
            root->left =deleteNode(root->left, key);
        }else if (root->val<key){
            root->right = deleteNode(root->right, key);
        }else{
            if(root->left==nullptr&&root->right ==nullptr){//如果要删除的子树是叶子节点,直接将空节点返回上层。
                return nullptr;
            }else if (root->left!=nullptr&&root->right == nullptr){//如果要删除的节点只有左孩子,就将左子节点返回上层。
                return root->left;
            }else if(root->left==nullptr&&root->right!=nullptr){//如果要删除的节点只有右孩子,就将有子节点返回上层。
                return root->right;
            }else{//如果要删除的子节点既有左孩子也有右孩子,将当前左子节点接到当前右子节点的左子树末尾,将当前子节点的右子树返回上层。
                TreeNode* cur = root->right;
                while(cur->left!=nullptr){
                    cur = cur->left;
                    }
                cur->left = root->left;
                return root->right;
            }
        }
        return root;
    }
};

;