Day23:Leetcode:530.二叉搜索树的最小绝对差 + 501.二叉搜索树中的众数 + 236. 二叉树的最近公共祖先

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

问题描述

解决方案:

1.思路

  • 中序遍历

2.代码实现

java 复制代码
class Solution {
    int pre;
    int ans;

    public int getMinimumDifference(TreeNode root) {
        ans = Integer.MAX_VALUE;
        pre = -1;
        dfs(root);
        return ans;
    }
    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        if (pre == -1) {
            pre = root.val;
        } else {
            ans = Math.min(ans, root.val - pre);
            pre = root.val;
        }
        dfs(root.right);
    }
}

3.复杂度分析

5.疑问

  • 递归树不太会画,课后请教通哥

LeetCode:501.二叉搜索树中的众数

解决方案:

1.思路:

  • 中序遍历+hashMap,考虑优化使用hashMap的时间复杂度;
  • 考虑到二叉搜索树中序遍历的有序性,实现一个update函数,根据记录频率实现众数的记录与更新
首先更新base和base出现的次数count
  • 如果所遍历节点值x=base,那么count+1;
  • 如果不等于base,那么把base加入answer数组,然后令base=x,count=1;
然后更新maxcount
  • 如果count=maxcount,那么说明该该数字出现的次数和已经出现的众数出现的次数一样,就把该数base存入数组answer中;
  • 如果count>maxcount,那么需要将max更新为maxcount。
  • 并情况answer数组,将base加入数组中;

2.代码实现

java 复制代码
class Solution {
    List<Integer> answer = new ArrayList<Integer>();
    int base, count, maxCount;

    public int[] findMode(TreeNode root) {
        dfs(root);
        int[] mode = new int[answer.size()];
        for (int i = 0; i < answer.size(); ++i) {
            mode[i] = answer.get(i);
        }
        return mode;
    }
			//中序遍历的逻辑
    public void dfs(TreeNode T) {
        if (T == null) {
            return;
        }
        dfs(T.left);
        update(T.val);
        dfs(T.right);
    }

    public void update(int x) {
        if (x == base) {
            ++count;
        } else {
            count = 1;
            base = x;
        }
        if (count == maxCount) {
            answer.add(base);
        }
        if (count > maxCount) {
            maxCount = count;
            answer.clear();
            answer.add(base);
        }
    }
}

3.复杂度分析

3.复杂度分析

  • 一定要动手画递归树;

LeetCode: 236. 二叉树的最近公共祖先

问题描述

解决方案:

1.思路:

  • 后序遍历可以最后处理根节点,相当于记录根节点;
  • 递归终止逻辑是:根节点为空,那么说明不存在p和q;或者p和q其中一个和根节点一致,那么直接返回该根节点即可;
  • 然后进行递归遍历,去获得
  • 如果

2.代码实现

java 复制代码
public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) {
            return root;
        }
//接住上一层传递回来的节点,要么是根据两个if语句返回的是root,要么是根据最后一句return,返回的是null
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if (left != null && right != null) {
            return root;
        }
        return left != null ? left : right;
    }
}

3.复杂度分析

4.疑惑思考

  • 递归出口是null很重要;
  • 当前节点的左右节点接住了上一层入栈函数的返回函数,返回的是null;
相关推荐
pursuit_csdn26 分钟前
力扣 347. 前 K 个高频元素
算法·leetcode
wen__xvn28 分钟前
每日一题洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵c++
c++·算法·矩阵
makabaka_T_T33 分钟前
25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表
数据结构·c++·算法·leetcode·链表·矩阵
辞半夏丶北笙1 小时前
最近最少使用算法(LRU最近最少使用)缓存替换算法
java·算法·缓存
BingLin-Liu1 小时前
蓝桥杯备考:六大排序算法
算法·排序算法
南玖yy1 小时前
C语言:数组的介绍与使用
c语言·开发语言·算法
小菜鸟博士1 小时前
手撕Vision Transformer -- Day1 -- 基础原理
人工智能·深度学习·学习·算法·面试
灰灰老师2 小时前
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
人工智能·算法·机器学习·数据挖掘·数据分析·kmeans·rapidminer
追求源于热爱!3 小时前
记4(可训练对象+自动求导机制+波士顿房价回归预测
图像处理·人工智能·算法·机器学习·回归
比特在路上3 小时前
蓝桥杯之c++入门(四)【循环】
c++·职场和发展·蓝桥杯