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

这篇博客介绍了如何在二叉搜索树中进行节点删除、插入以及查找最近公共祖先的操作。删除节点时考虑了五种情况,包括目标节点为叶节点、有左右子树等。插入节点时,在叶子节点处创建新节点。查找最近公共祖先通过比较节点值来确定。所有操作都遵循二叉搜索树的性质,确保了树的平衡和正确性。
摘要由CSDN通过智能技术生成

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

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

  1. return left return right 可以理解为向上传递下面的结果 可能为null 可能为结果 因为这是有返回值的
  2. 只要root遍历到 p和q一个在左 一个在右 那该root就是最小公共祖先
/**
 * 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) {
        //终止条件
        if(root==null) return null;
        

        //判断pq位置
        if(p.val<root.val && q.val<root.val){
            TreeNode left = lowestCommonAncestor(root.left,p,q); //left用来接下面传上来的结果 可能为最小祖先root 也可能为空
            if(left!=null) return left;
        }
        if(p.val>root.val && q.val>root.val){
            TreeNode right = lowestCommonAncestor(root.right,p,q);
            if(right!=null) return right;
        }        
        return root;
    }
}

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

  1. 不用被题目误导重新构造二叉树 最简单的操作就是 遍历到叶节点 然后添加新节点
  2. 如何插入新节点 在叶节点处创建新节点后 返回该节点向上 然后遍历时 用root.left/root.right 来接
  3. 最后返回根节点root
  4. 审题很重要
/**
 * 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;
        }

        if(val<root.val){
            //接住下面新创建的叶节点return 上来的值 
            root.left = insertIntoBST(root.left,val);
        }
        if(val>root.val){
            root.right = insertIntoBST(root.right,val);
        }
        //返回根节点
        return root;
    }
}

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

  1. 有5种情况 每种对二叉树 的操作不同
    1. 没找到目标节点 return null
    2. 目标节点为叶节点 return null
    3. 目标节点 有左子树 无右子树 return root.left
    4. 目标节点 有右子树 无左子树 return root.right
    5. 目标节点 有左右子树 将左子树添加到作为右子树的最左端节点的左子树 然后return root.right 可以用一个指针一直root.left过去
/**
 * 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.val==key){
            if(root.left==null && root.right==null){
                return null;
            }else if(root.left!=null && root.right==null){
                return root.left;
            }else if(root.right!=null && root.left==null){
                return root.right;
            }else{
                //将该节点的左子树放到他的右子树里面去 找到右子树中最小的值
                TreeNode cur = root.right;
                while(cur.left!=null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;

            }
        }

        //向左右递归  不用遍历整个二叉树
        if(root.val>key) root.left = deleteNode(root.left,key);
        if(root.val<key) root.right = deleteNode(root.right,key);
        return root;




    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值