力扣labuladong一刷day35天

力扣labuladong一刷day35天

文章目录

      • 力扣labuladong一刷day35天
      • [一、98. 验证二叉搜索树](#一、98. 验证二叉搜索树)
      • [二、700. 二叉搜索树中的搜索](#二、700. 二叉搜索树中的搜索)
      • [三、701. 二叉搜索树中的插入操作](#三、701. 二叉搜索树中的插入操作)
      • [四、450. 删除二叉搜索树中的节点](#四、450. 删除二叉搜索树中的节点)

一、98. 验证二叉搜索树

题目链接:https://leetcode.cn/problems/validate-binary-search-tree/

思路:校验二叉搜索树的合法性,简单的想法直接遍历判断左右孩子与父节点值的关系即可,但是有时候会出现问题,如何 10 -> { 5, 15-> {6, 20} }。看似都满足,其实不是的,6归属于10的右子树,但是却比10小,这也就是说每一个root只管的了他的左右孩子,但没法把约束root的信息传递给左右孩子,所以我们在遍历的时候就要携带上root的约束范围向下传递。也就是说从上往下遍历的过程中记录好每一个节点的约束范围。

java 复制代码
class Solution {
   public boolean isValidBST(TreeNode root) {
        return isValidBST(root, null, null);
    }

    boolean isValidBST(TreeNode root, TreeNode min, TreeNode max) {
        if (root == null) return true;
        if (min != null && root.val <= min.val) return false;
        if (max != null && root.val >= max.val) return false;
        return isValidBST(root.left, min, root) && isValidBST(root.right, root, max);
    }
}

二、700. 二叉搜索树中的搜索

题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/

思路:在二叉搜索树中搜索值,只需要利用二叉搜索树的特性,val<root.val 去左子树进行搜索,val>root.val去右子树搜索 val == root.val 返回。

java 复制代码
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) return null;
        if (val < root.val) return searchBST(root.left, val);
        if (val > root.val) return searchBST(root.right, val);
        return root;
    }
}

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

题目链接:https://leetcode.cn/problems/insert-into-a-binary-search-tree/

思路:对于二叉搜索树的插入和查询思路是类似的,左右判断一路向下搜索,为node == null就找到了位置new 新节点返回就是。

java 复制代码
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;
    }
}

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

题目链接:https://leetcode.cn/problems/delete-node-in-a-bst/

思路:其实对于二叉搜索树的查找、新增、修改都是一样的思路,对于删除却不一样,有3中可能性,①、要删除节点为叶子节点。②、要删除节点只有一个孩子节点。③、要删除节点有两个孩子节点。

①、直接返回null

②、返回另一个非空的孩子节点。

③、有两种删除方法,可以拿当前节点的左子树中最大值(即一路p=p.right)进行交换,然后递归删除,也可以拿当前节点的右子树中的最小值(即一路p=p.left)进行交换,然后递归删除。

java 复制代码
class Solution {
   public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) return null;
        if (key == root.val) {
            if (root.left == null && root.right == null) return null;
            if (root.left == null && root.right != null) return root.right;
            if (root.left != null && root.right == null) return root.left;

            TreeNode p = root.right;
            while (p.left != null) {
                p = p.left;
            }
            root.val = p.val;
            root.right = deleteNode(root.right, root.val);

        } else if (key < root.val) {
            root.left = deleteNode(root.left, key);
        }else {
            root.right = deleteNode(root.right, key);
        }
        return root;
    }
}
相关推荐
倔强的石头_6 分钟前
【数据结构与算法】插入排序:原理、实现与分析
算法
倔强的石头_8 分钟前
【数据结构与算法】希尔排序:基于插入排序的高效排序算法
后端·算法
Shaun_青璇17 分钟前
CPP基础(2)
开发语言·c++·算法
红糖生姜1 小时前
字符串|数组|计算常见函数整理-竞赛专用(从比赛真题中总结的,持续更新中)
c++·算法
焜昱错眩..2 小时前
代码随想录训练营二十六天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树的搜索 98.验证二叉搜索树
数据结构·算法
jndingxin2 小时前
OpenCV CUDA模块中用于稠密光流计算的 TV-L1(Dual TV-L1)算法类cv::cuda::OpticalFlowDual_TVL1
人工智能·opencv·算法
geneculture2 小时前
路径=算法=操作:复杂系统行为的统一数学框架
人工智能·算法·数学建模·课程设计·智慧系统·融智学的重要应用·复杂系统
AcrelGHP2 小时前
建筑末端配电回路安全用电解决方案:筑牢电气防火最后一道防线
人工智能·算法·安全
独行soc2 小时前
2025年渗透测试面试题总结-长亭科技[实习]安全服务工程师题目+回答)
linux·科技·安全·面试·职场和发展·区块链
Watink Cpper2 小时前
[灵感源于算法] 链表类问题技巧总结
数据结构·算法·链表