• 【LeetCode-面试经典150题-day25】


    目录

    530.二叉搜索树的最小绝对差

     230.二叉搜索树中第K小的元素

     98.验证二叉搜索树


     

    530.二叉搜索树的最小绝对差

    题意:

    给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

    差值是一个正数,其数值等于两值之差的绝对值。

    • 树中节点的数目范围是 [2, 100]
    • 0 <= Node.val <= 105

    【输入样例】root = [4,2,6,1,3]

    【输出样例】1

    解题思路:

    二叉搜索树的特点,左子树的所有值都比根节点小,右子树的所有值都比根节点大;

    要找最小差值,其选择一定为相邻两个元素之差的最小值

    通过遍历树来计算差值,并将结果保存起来,边遍历边比较。

    遍历方法使用中序遍历,因为中序遍历出来的结果是有序的。

    1. class Solution {
    2. int ans,pre;//Pre保存前驱节点的值
    3. public int getMinimumDifference(TreeNode root) {
    4. ans = Integer.MAX_VALUE;
    5. pre = -1;//提示中说明节点值的范围是[0,105],所以初始化为-1
    6. midOrder(root);
    7. return ans;
    8. }
    9. void midOrder(TreeNode root){
    10. if(root == null){
    11. return;
    12. }
    13. midOrder(root.left);
    14. if(pre == -1){
    15. pre = root.val;
    16. }else{
    17. ans = Math.min(ans, root.val - pre);
    18. pre = root.val;
    19. }
    20. midOrder(root.right);
    21. }
    22. }

    时间: 击败了100.00%

    内存: 击败了29.78%

     230.二叉搜索树中第K小的元素

    题意:

    给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

    提示:

    • 树中的节点数为 n 。
    • 1 <= k <= n <= 104
    • 0 <= Node.val <= 104

    【输入样例】root = [3,1,4,null,2], k = 1

    【输出样例】1

    解题思路:

    中序遍历找到第k个数就可以了。

    为了避免遍历完所有节点,不使用递归搜索,而是使用迭代搜索,借助栈

    1. class Solution {
    2. public int kthSmallest(TreeNode root, int k) {
    3. Deque stack = new ArrayDeque();
    4. while(root != null || !stack.isEmpty()){
    5. while(root != null){
    6. stack.push(root);//先把根存进去,然后先找左子树
    7. root = root.left;//左 根 右,持续进栈根节点,直到找到最左的节点
    8. }
    9. //循环结束条件是root为空,证明上一个root没有左节点,出栈
    10. root = stack.pop();
    11. --k;//遍历到一个数减一次
    12. if(k == 0){
    13. break;
    14. }
    15. root = root.right;//往节点右子树找了
    16. }
    17. return root.val;
    18. }
    19. }

    时间: 击败了24.31%

    内存: 击败了75.46%

     98.验证二叉搜索树

    题意:

    给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

    有效 二叉搜索树定义如下:

    • 节点的左子树只包含 小于 当前节点的数。
    • 节点的右子树只包含 大于 当前节点的数。
    • 所有左子树和右子树自身必须也是二叉搜索树。

    提示:

    • 树中节点数目范围在[1, 104] 内
    • -231 <= Node.val <= 231 - 1

    【输入样例】root = [2,1,3]

    【输出样例】true

    解题思路:

    跟上一题一样,借助栈进行中序遍历,用pre保存前一节点的值,如果root.val <=pre,则表示不是二叉搜索树。

    1. class Solution {
    2. public boolean isValidBST(TreeNode root) {
    3. double pre = -Double.MAX_VALUE;;
    4. Deque stack = new ArrayDeque();
    5. while(root != null || !stack.isEmpty()){
    6. while(root != null){
    7. stack.push(root);
    8. root = root.left;
    9. }
    10. root = stack.pop();
    11. if(root.val <= pre){//=也不符合二叉搜索树的要求
    12. return false;//不满足
    13. }
    14. pre = root.val;
    15. root = root.right;
    16. }
    17. return true;
    18. }
    19. }

    时间: 击败了18.62%

    内存: 击败了49.12%

  • 相关阅读:
    创建Hibernate项目与实现一个例子(idea版)
    2023年【化工自动化控制仪表】最新解析及化工自动化控制仪表作业考试题库
    LeetCode题练习与总结:组合-77
    结构化数据和非结构化数据
    uni-app学习记录
    uniapp 实现微信小程序手机号一键登录
    Qt6 设计工具
    【Python】Python安装指定版本库
    HttpMessageConverter 消息转换器
    kylin使用心得
  • 原文地址:https://blog.csdn.net/qq_37998848/article/details/132940544