501. 二叉搜索树中的众数
难度简单
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
思路
这里的定义与我们一般碰见的BST的定义不同,所以需要清楚的是在左子树以及右子树都有可能出现等于当前节点的值,所以单独进行递归时非常难处理
但是我在之前的一个题中说过,在二叉搜索树上进行遍历,获得到的就是一个有序数组。
在一个有序数组上求众数,岂不是手到擒来?
如果实在不理解的话可以先中序遍历将所有元素加到一个数组中,然后在数组上进行求众数
当然不是很推荐这种做法,这样会导致时间效率比较低
package cn.edu.xjtu.carlWay.tree.findModeInBST;
import cn.edu.xjtu.Util.TreeNode.TreeNode;
import java.util.ArrayList;
import java.util.List;
/**
* 501. 二叉搜索树中的众数
* 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
* <p>
* 如果树中有不止一个众数,可以按 任意顺序 返回。
* <p>
* 假定 BST 满足如下定义:
* <p>
* 结点左子树中所含节点的值 小于等于 当前节点的值
* 结点右子树中所含节点的值 大于等于 当前节点的值
* 左子树和右子树都是二叉搜索树
* <p>
* https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/
*/
public class Solution {
List<Integer> result = new ArrayList<>();
int maxNum = 0;
TreeNode pre;
int count = 0;
public int[] findMode(TreeNode root) {
if (root == null) return null;
traversal(root);
int[] ret = new int[result.size()];
for (int i = 0; i < ret.length; i++) {
ret[i] = result.get(i);
}
return ret;
}
private void traversal(TreeNode root) {
if (root == null) return;
// 递归左子树
traversal(root.left);
// 处理数据
if (pre == null || root.val != pre.val) {
count = 1;
} else {
count++;
}
if (count > maxNum) {
result.clear();
result.add(root.val);
maxNum = count;
} else if (count == maxNum) {
result.add(root.val);
}
pre = root;
// 递归右子树
traversal(root.right);
}
}