算法训练营Day22(二叉树)

2023-12-20 15:03:25

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

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

相对于?二叉树的最近公共祖先?本题就简单一些了,因为?可以利用二叉搜索树的特性。?

我的题解,,前序遍历做的,用了二叉搜索树的特性,但是只用了一半。。还是挺慢

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null || root==p || root==q)return root;
        if((root.val>q.val&&root.val<p.val) || (root.val<q.val&&root.val>p.val))return root;
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(left!=null)return left;
        return right;
    }
}

卡哥的递归法,在我的基础上加了一些。我的好像还比他的快,

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return root;
        if(root.val>p.val&&root.val>q.val) return lowestCommonAncestor(root.left,p,q);
        if(root.val<p.val&&root.val<q.val) return lowestCommonAncestor(root.right,p,q);
        return root;
    }
}

迭代法,也好理解的一批

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while(true){
            if(root.val>p.val&&root.val>q.val){
                root = root.left;
            }else if(root.val<p.val&&root.val<q.val){
                root = root.right;
            }else{
                break;
            }
        }
        return root;
    }
}

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

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

递归法

这里点一下我做题的时候的误区,我一直以为要中序遍历,但是二叉搜索树这里并不是都需要中序遍历的,可以根据特性固定遍历顺序的时候,就可以直接用二叉搜索树的特性了。

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null) return new TreeNode(val);
        if(val<root.val) root.left = insertIntoBST(root.left,val);
        if(val>root.val) root.right = insertIntoBST(root.right,val);
        return root;
    }
}

迭代法

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null) return new TreeNode(val);
        TreeNode res = root;
        while(true){
            if(val<root.val){
                if(root.left!=null){
                    root=root.left;
                    continue;
                }
                root.left = new TreeNode(val);
                break;
            }else if(val>root.val){
                if(root.right!=null){
                    root=root.right;
                    continue;
                }
                root.right = new TreeNode(val);
                break;
            }
        }
        return res;
    }
}

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

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

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root==null) return null;
        if(root.val == key){
            //左为null右为null
            if(root.left==null&&root.right==null){
                return null;
            }
            //左不为null右为null
            else if(root.left!=null&&root.right==null){
                return root.left;
            }
            //左为null右不为null
            else if(root.left==null&&root.right!=null){
                return root.right;
            }
            //左右都不为null
            else{
                //当前要删的节点的右孩子
                TreeNode cur = root.right;
                //找右孩子的最小值(最左孩子)
                while(cur.left!=null)cur=cur.left;
                //root左孩子给cur
                cur.left = root.left;
                //结果返回右孩子
                return root.right;
            }
        }

        //到这里只是写完了终止条件
        //开始赋值,递归的单层逻辑
        if(key<root.val) root.left = deleteNode(root.left,key);
        if(key>root.val) root.right = deleteNode(root.right,key);
    
        return root;
    }
}

文章来源:https://blog.csdn.net/weixin_65728526/article/details/135101747
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。