【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

文章目录

    • [Leetcode 235. 二叉搜索树的最近公共祖先](#Leetcode 235. 二叉搜索树的最近公共祖先)
    • [Leetcode 701. 二叉搜索树中的插入操作](#Leetcode 701. 二叉搜索树中的插入操作)
    • [Leetcode 450. 删除二叉搜索树中的节点](#Leetcode 450. 删除二叉搜索树中的节点)

草稿图网站
java的Deque

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

题目: 235. 二叉搜索树的最近公共祖先
解析: 代码随想录解析

解题思路

法1:和人二叉树的最近公共祖先一样的遍历搜索方法。

代码

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 || root == p || root == q)
            return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        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;
    }
}

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

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

总结

利用好二叉搜索树的有序性

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

题目: 701. 二叉搜索树中的插入操作
解析: 代码随想录解析

解题思路

迭代和递归

代码

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)
            return new TreeNode(val);
        TreeNode pre = null;
        TreeNode cur = root;
        while (cur != null) {
            if (val < cur.val) {
                pre = cur;
                cur = cur.left;
            } else if (val > cur.val) {
                pre = cur;
                cur = cur.right;
            }
            
        }
        if (val < pre.val)
            pre.left = new TreeNode(val);
        else
            pre.right = new TreeNode(val);
        return root;
    }
}

//递归
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;
    }
}

总结

根据二叉搜索树的性质

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

题目: 450. 删除二叉搜索树中的节点
解析: 代码随想录解析

解题思路

应该为左为空,右为空,左右都不为空的情况

代码

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) {
        if (root == null)
            return root;
        if (root.val == key) {
            if (root.left == null)
                return root.right;
            else if (root.right == null)
                return root.left;
            else{
                TreeNode cur = root.left;
                while (cur.right != null)
                    cur = cur.right;
                cur.right = root.right;
                root = root.left;
                return root;
            }
        }
        if (key < root.val) root.left = deleteNode(root.left, key);
        if (key > root.val) root.right = deleteNode(root.right, key);
        return root;
    }
}

总结

暂无

相关推荐
炽烈小老头1 分钟前
【每天学习一点算法 2026/05/21】课程表
学习·算法
luoganttcc4 分钟前
大模型是否即将到达算法极限
算法
叶小鸡32 分钟前
小鸡玩算法-力扣HOT100-动态规划(上)
算法·leetcode·动态规划
LuminousCPP38 分钟前
数据结构 - 线性表第三篇:基于顺序表实现 C 语言通讯录(基础功能篇)
c语言·数据结构·经验分享·笔记·算法
_日拱一卒43 分钟前
LeetCode:114二叉树展开为链表
java·开发语言·算法
无小道1 小时前
Redis——哈希类型相关指令
redis·算法·哈希算法
凌波粒1 小时前
LeetCode--513.找树左下角的值(二叉树)
java·算法·leetcode
一个不知名程序员www1 小时前
算法学习入门---算法题DAY1
c++·算法
子琦啊1 小时前
构造函数、this指向和原型链机制
javascript·算法·贴图
WHS-_-20221 小时前
Millimeter Wave ISAC-SLAM: Framework and RFSoC Prototype
人工智能·算法·原型模式