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;
相关推荐
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown4 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错6 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny7 小时前
计算网络信号
java·算法·华为
景鹤7 小时前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie7 小时前
SCNU习题 总结与复习
算法