1. 题目

2. 思路
(1) 中序遍历
- 在二叉搜索树中,中序遍历的结果是有序的,因此,相等的数是相邻的。记录当前结点的前一个结点及其个数,若当前结点等于前一个结点,则个数加1,否则,更新前一个结点的记录,并设置个数为1。
- 中序遍历时,记录当前结点之前的众数及其个数,若当前结点的个数等于众数的个数,则将当前结点记为众数;若当前结点的个数大于众数的个数,则清除之前记录的众数,并设置当前结点为唯一众数。
3. 代码
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
private List<Integer> nums;
private int maxCount;
private int preNum;
private int preCount;
public int[] findMode(TreeNode root) {
nums = new ArrayList<>();
inorder(root);
int[] res = new int[nums.size()];
for (int i = 0; i < nums.size(); i++) {
res[i] = nums.get(i);
}
return res;
}
private void inorder(TreeNode root) {
if (root == null) {
return;
}
inorder(root.left);
if (root.val == preNum) {
preCount++;
} else {
preNum = root.val;
preCount = 1;
}
if (preCount == maxCount) {
nums.add(preNum);
} else if (preCount > maxCount) {
nums.clear();
nums.add(preNum);
maxCount = preCount;
}
inorder(root.right);
}
}