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

本文详细介绍了如何在二叉搜索树中实现最近公共祖先的查找算法,以及插入和删除节点的操作方法,包括递归实现和处理边界条件的过程。
摘要由CSDN通过智能技术生成

代码随想录算法训练营

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



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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        int pval=p.val;
        int qval=q.val;
        int min=Math.min(pval,qval);
        int max=Math.max(pval,qval);
        return findNode(root,min,max);
    }
    public TreeNode findNode(TreeNode root,int min,int max) {
        if(root==null||(root.val>=min&&root.val<=max)){
            return root;
        }
        TreeNode left=findNode(root.left,min,max);
        TreeNode right=findNode(root.right,min,max);
        if (left == null && right == null) {
            return null;
        } else if (left != null && right == null) {
            return left;
        } else if (left == null && right != null) {
            return right;
        }else{
            return root;
        }
    }
}

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root==null){
            TreeNode node=new TreeNode(val);
            return node;
        }
        addNode(root,val);
        return root;
    }
    public void addNode(TreeNode root,int val) {
        if(root.val>val&&root.left==null){
            TreeNode node=new TreeNode(val);
            root.left=node;
            return;
        }else if(root.val<val&&root.right==null){
            TreeNode node=new TreeNode(val);
            root.right=node;
            return;
        }
        if(root.val<val){
            //说明其在右侧
            addNode(root.right,val);
        }
        if (root.val > val) {
            addNode(root.left,val);
        }
    }
}

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root==null){
            return null;
        }
        if(root.left==null&&root.right==null&&root.val==key){
            return null;
        }
        if(root.val==key){
            //删的是中间那个树顶节点
            if(root.right!=null){
                //找左孩子的最右子节点
                if(root.left!=null){
                    if(root.left.right!=null){
                        findRight(root.left);
                        if(root.right.left!=null){
                            right.right=root.right.left;
                        }
                    }else{
                        root.left.right=root.right.left;
                    }
                }
                root.right.left=root.left;
                return root.right;
            }else{
                return root.left;
            }
        }
        deleteKey(root,key);
        return root;
    }
    TreeNode pre;
    TreeNode right;
    public void deleteKey(TreeNode root,int key) {
        if (root == null) {
            return;
        }
        if(key==root.val){
            if(root.right!=null){
                //root的右孩子右孩子不为空
                //判断root是pre的左孩子还是右孩子
                if(pre.left==root){
                    //是pre的左孩子
                    //找到原先root.left的最右子节点
                    if(root.left!=null){
                        if(root.left.right!=null){
                            findRight(root.left);
                            if(root.right.left!=null){
                                right.right=root.right.left;
                            }
                        }else{
                            root.left.right=root.right.left;
                        }
                        root.right.left=null;
                        pre.left=root.right;
                        root.right.left=root.left;
                    }else{
                        pre.left=root.right;
                    }
                }else{
                    //是pre的右孩子
                    //找到原先root.left的最右子节点
                    if(root.left!=null){
                        if (root.left.right != null) {
                            findRight(root.left);
                            if (root.right.left != null) {
                                right.right=root.right.left;
                            }
                        }else{
                            root.left.right=root.right.left;
                        }
                        root.right.left=null;
                        pre.right=root.right;
                        root.right.left=root.left;
                    }else{
                        pre.right=root.right;
                    }
                }
            }else{
                //root的右孩子为空,判断有没有左孩子
                TreeNode node=root;
                if(node.left!=null){
                    if(pre.left==node){
                        pre.left=node.left;
                    }else{
                        pre.right=node.left;
                    }
                }else{
                    //root的左孩子和右孩子都为空
                    if(pre.left==node){
                        pre.left=null;
                    }else{
                        pre.right=null;
                    }
                }
            }
            return;
        }
        pre=root;
        if(key<root.val){
            deleteKey(root.left,key);
        }
        if(key>root.val){
            deleteKey(root.right,key);
        }
    }

    public void findRight(TreeNode node) {
        if(node.right==null){
            right=node;
            return;
        }
        findRight(node.right);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值