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;
相关推荐
To_OC24 分钟前
LC 35 搜索插入位置:二分查找谁都会,边界条件谁写谁懵
javascript·算法·leetcode
天才测试猿1 小时前
2026软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
码哥DFS1 小时前
二叉树的直径
开发语言·javascript·算法
营养充电站4 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
技术小黑4 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
Ivanqhz7 小时前
php8 use-def链
算法·php
spter。7 小时前
AI 面试相同请求为什么会重复调用,如何解决
人工智能·面试·职场和发展
evans在进步7 小时前
LeetCode 189 轮转数组:三次反转原地解决,图解 Java 实现
java·算法·leetcode
歌_顿7 小时前
Drawing_To_Model
算法