DAY20 - 235. 二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点

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

遇到BST就要利用它的性质。p q的公共祖先应该是 [p,q] 中间的。

BST特性:从上到下碰到的第一个[p,q]之间的结点就是最近公共祖先

class Solution {
public:
    TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q){
        if(root==nullptr) return nullptr;

        if(root->val>=p->val&&root->val<=q->val) return root;

        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left&&right) return root;
        return left ? left : right;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(p->val>q->val) swap(p,q);
        return traversal(root,p,q);
    }
};

注意还是需要这一段

TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(left&&right) return root;
return left ? left : right;

否则返回值就没有人接收了。一开始写的错误版本:

lowestCommonAncestor(root->left,p,q);
lowestCommonAncestor(root->right,p,q);
return nullptr;

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

BST的插入操作,其实只要加入叶子节点就行,不涉及重构

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

这个写法需要注意一下 root->left = insertIntoBST(root->left, val); 这样就做到了递归修改树的结点。

if (val < root->val) root->left = insertIntoBST(root->left, val);
if (val > root->val) root->right = insertIntoBST(root->right, val);

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

删除BST的结点就涉及到重构了

第一想法:删掉某一个结点,要把它的子结点全部重新插入二叉树。=》需要一个数组来记录叶子节点。

这样的时间复杂度就很高了。还是有一些算法可以使用的:

posted @ 2025-04-12 20:33  ChloeChen0221  阅读(12)  评论(0)    收藏  举报