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

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

题目链接

https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/

思路

因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 p, q区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。所以子需要从上到下遍历第一次遇见符合条件的就是最小的公共祖先

代码:

java 复制代码
/**
 * 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;
         }
        if(root.val>p.val&&root.val>q.val){//root.val比p,q的值都大,说明最小祖先在左子树
            TreeNode left=lowestCommonAncestor(root.left,p,q);
            if(left!=null){
                return left;
            }
        }
        if(root.val<p.val&&root.val<q.val){//root.val比p,q的值都小,说明最小祖先在右子树
            TreeNode right=lowestCommonAncestor(root.right,p,q);
            if(right!=null){
                return right;
            }
        }
        return root;
    }
}

二叉搜索树中的插入操作

题目链接

https://leetcode.cn/problems/insert-into-a-binary-search-tree/

思路:

基本情况:如果传入的树根节点root为null,表示树为空。此时,函数创建一个新的TreeNode对象,用val初始化,并返回这个新节点作为新的树根。

递归情况:如果树不为空,函数会根据val和当前节点root的值进行操作:

如果val小于root.val,说明val应该被插入到左子树中。因此,函数会递归调用自身,将val插入到root.left(左子节点),并将更新后的左子树赋值回root.left。

如果val大于root.val,说明val应该被插入到右子树中。同理,函数会递归调用自身,将val插入到root.right(右子节点),并将更新后的右子树赋值回root.right。

返回结果:无论哪种情况,函数最后都会返回当前节点root。这使得递归调用能够逐级更新原树结构,直到插入操作完成并返回最初的树根节点。

代码:

java 复制代码
/**
 * 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(root.val>val){
            root.left=insertIntoBST(root.left,val);
        }
        if(root.val<val){
            root.right=insertIntoBST(root.right,val);
        }
        return root;
    }
}

删除二叉搜索树中的节点

题目链接

https://leetcode.cn/problems/delete-node-in-a-bst/

思路:

首先判断根节点是否为空,若为空则返回null。然后判断根节点的值是否等于要删除的值,若相等则分四种情况处理:若该节点没有左右子节点,则直接返回null;若只有左子节点,则返回左子节点;若只有右子节点,则返回右子节点;若既有左子节点又有右子节点,则找到右子树中最小的节点,将其值替换要删除的节点的值,并删除右子树中最小的节点。接着判断要删除的值是否小于根节点的值,若是则递归地在左子树中删除该值;若大于根节点的值,则递归地在右子树中删除该值。最后返回修改后的根节点。

代码:

java 复制代码
/**
 * 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) {
     // 如果根节点为空,直接返回null
        if (root == null) {
            return null;
        }
        // 如果找到需要删除的节点
        if (root.val == key) {
            // 如果该节点没有子节点,直接删除(返回null)
            if(root.left==null&&root.right==null){
                return null;
            }
            // 如果该节点只有左子节点,用左子节点替换该节点后返回
            else if(root.left!=null&&root.right==null){
                return root.left;
            }
            // 如果该节点只有右子节点,用右子节点替换该节点后返回
            else if(root.left==null&&root.right!=null){
                return root.right;
            }
            // 如果该节点既有左子节点又有右子节点,找到右子树中最小的节点,将其值替换该节点的值,然后递归删除右子树中的该最小节点
            else if(root.left!=null&&root.right!=null){
                TreeNode temp=root.right;
                while (temp.left!=null){
                    temp=temp.left;
                }
                temp.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;
    }
}
相关推荐
handonch几秒前
金仓 KingbaseES 时区问题根治指南:从「总是差 8 小时」到全链路统一
linux·docker·postgresql·信创
小白起 v2 分钟前
【算法学习 · 01】深入理解大 O 表示法:从「能跑就行」到「专业评估」算法性能
算法
梦帮科技3 分钟前
脑机接口(BCI)与神经系统安全:EEG 神经电信号欺骗注入、神经闭环解码算法与生物黑客反制
算法·安全
老徐聊GEO4 分钟前
把“安徽“写进题面之后:多平台AI推荐名单的区域扰动测量(2026)
前端·人工智能·算法·geo优化
人工智能培训5 分钟前
具身智能:让人工智能拥有物理世界感知能力
大数据·人工智能·学习·算法·机器学习
果壳science5 分钟前
张祥前最新研究成果登上SCI期刊!
笔记·嵌入式硬件·算法·硬件工程·几何学
Rabitebla7 分钟前
【Linux 底层原理】工具篇(一):掌握 Ubuntu apt,让软件安装与管理更简单
linux·笔记·算法·ubuntu
chde2Wang10 分钟前
Hadoop集群无datanode进程
linux·运维·服务器
叼烟扛炮22 分钟前
Linux 学习笔记(十八):进程控制——优雅地退出与等待
linux·运维·服务器
叼烟扛炮26 分钟前
Linux 学习笔记(二十三):深入 Ext 文件系统(下)—— 原理、缓存与软硬链接
linux·笔记·学习