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

94 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情🚀🚀

235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)

image.png

递归

var lowestCommonAncestor = function(root, p, q) {
    if(!root) return root;
    const dfs = (root,p,q) => {
        if(!root) return null
        if(root == p || root == q) return root;
        if(root.val>p.val&&root.val>q.val){
             root.left = dfs(root.left,p,q);
            return root.left
        }
            
        if(root.val<p.val&&root.val<q.val){
             root.right = dfs(root.right,p,q)
            return root.right
        }
        return root;
    }
    return dfs(root,p,q)
};

注意点

  • 这里二叉搜索树的公共结点的查找也可以直接用二叉搜索树的公共结点查找的解法去解答出来.
  • 两者的不同:

自己写的时候用了二叉树的解法,发现在进行最后值传递的时候,会行不通。因为这个方法会去判断,左子树和右子树是不是为空。但是在二叉搜索树中,root就压根不会存在左子树为空或者右子树为空的情况,所以碰到如下这种情况,会直接返回根节点

image.png

  • 这里题目其实就只有四种情况

    1. 当查找的值不存在时
    2. 当q,p都在左侧时
    3. 当q,p都在右侧时
    4. 那么剩下的情况就是在两侧了,这个时候直接返回root结点即可了

701. 二叉搜索树中的插入操作 - 力扣(LeetCode)

image.png

递归

var insertIntoBST = function(root, val) {
    const dfs = (root,val) => {
        if(root == null){
            let root = new TreeNode(val)
            return root
        }
        if(root.val < val){
             root.right = dfs(root.right,val)
        }
        if(root.val > val){
             root.left =  dfs(root.left,val);
        }
        return root
    }
    return dfs(root,val)
};

这个题目比较简单~~

450. 删除二叉搜索树中的节点 - 力扣(LeetCode)

image.png

递归

var deleteNode = function(root, key) {
    if(!root) return root;
    const dfs = (root,key) => {
        if(!root) return null
        if(root.val == key){
            if(!root.left && !root.right) return null;
            if(root.left && !root.right) return root.left
            if(!root.left && root.right) return root.right
            if(root.left && root.right) {
                let cur  = root.right;
                while(cur.left){
                    cur = cur.left
                }
                 cur.left = root.left
                 return root.right
            }
        }

        if( root.val > key)
        root.left = dfs(root.left,key)

        if(root.val < key)
        root.right = dfs(root.right,key)

        return root;
    }
    return dfs(root,key)

};

收获

这里经常困扰我的问题是,不会进行分情况的讨论,而是当意识到有不同种情况的时候,往往会去想有没有一种一劳永逸的统一方法去处理不同的情况。如果这个方法没有的话,我就束手就擒了。不会进行各个击破。

像这个题目,最难的地方就是被删结点左右两侧都有值时,如何进行二叉树的重构,如何去寻找下一个较大的结点。

搞懂这道题之后,还是发现这个题目还是比较有趣的~~