代码随想录刷题笔记-Day19

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

530. 二叉搜索树的最小绝对差icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-absolute-difference-in-bst/

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

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

示例 1:

输入:root = [4,2,6,1,3]
输出:1

示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1

解题思路

要求最小的差,根据特性,对于每一个节点root来说,左右子树中差值最小的节点是左子树的最右节点,右子树的最左节点。

考虑递归实现

  • 返回值和参数:root节点为参数,返回当前的最小差值;
  • 终止条件:root为null的时候,返回一个特别大的值比如Integer.MAX_VALUE
  • 递归逻辑:中序遍历,先递归左节点,然后比较返回值和root与左边最大值的差值,并更新最大值为root,然后右节点。

代码

class Solution {
    TreeNode max;

    public int getMinimumDifference(TreeNode root) {
        if (root == null)
            return Integer.MAX_VALUE;
        int left = getMinimumDifference(root.left);//左
        int min = max != null ? Math.min(left, root.val - max.val) : left;//如果已经有max了,就判断当前节点的插值和左边返回的插值中小的那个
        max = root;

        return Math.min(min, getMinimumDifference(root.right));//右,并比较左右返回值的较小值返回
    }
}

2. 二叉搜索树中的众数

501. 二叉搜索树中的众数icon-default.png?t=N7T8https://leetcode.cn/problems/find-mode-in-binary-search-tree/

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

 解题思路

利用二叉树的特性,中序遍历,但是遍历过程中需要维持一个list来保存过程中的众数,也要有一个count来记录当前的count,也要一个maxCount来记录最大的众数次数。

代码

class Solution {
    TreeNode pre;
    int maxCount;
    int count;
    List<Integer> list;

    public int[] findMode(TreeNode root) {
        maxCount = 0;
        count = 0;
        list = new ArrayList<>();
        searchBST(root);
        return list.stream().mapToInt(Integer::intValue).toArray();
    }

    public void searchBST(TreeNode root) {
        if (root == null)
            return;

        searchBST(root.left);

        if (pre != null && pre.val == root.val)
            count++;
        else
            count = 1;
        if (count == maxCount)
            list.add(root.val);
        else if (count > maxCount) {
            list.clear();
            list.add(root.val);
            maxCount = count;
        }
        pre = root;

        searchBST(root.right);
    }
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值