代码随想录刷题笔记-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++;elsecount = 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);}
}