1. 二叉搜索树的最小绝对差
530. 二叉搜索树的最小绝对差https://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. 二叉搜索树中的众数https://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);
}
}