1.题目描述:
给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。
2.中序遍历(递归):
这道题目难点在于众数不止一个,刚开始写代码使用了哈希表来统计频次,但得到记录频次的哈希表,获取value排序后对应的key值较难。采用pre,count,maxCount,list集合来达到效果,pre是中序遍历前驱节点用来比较是否相等,count记录频次需要重置,maxCount记录是否最大频次,list集合记录众数需要重置。代码如下:
/**
* Definition for a binary tree node.
* public 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> list = new ArrayList<>();
private int pre, count, maxCount = 0;
public int[] findMode(TreeNode root) {
inOrder(root);
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) res[i] = list.get(i);
return res;
}
public void inOrder(TreeNode root) {
if (root == null) return;
inOrder(root.left);
update(root.val);//较复杂抽取成一个方法
inOrder(root.right);
}
public void update(int cur) {
if (pre == cur) count++;
else {
pre = cur;
count = 1;//重置count为1
}
if (count == maxCount) list.add(cur);
if (count > maxCount) {
maxCount = count;
list.clear();//重置list
list.add(cur);
}
}
}
3.中序遍历(迭代):
class Solution {
List<Integer> list = new ArrayList<>();
int pre, count, maxCount = 0;
public int[] findMode(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode temp = root;
while (temp != null || !stack.isEmpty()) {
if (temp != null) {
stack.push(temp);
temp = temp.left;//left
} else {
temp = stack.pop();//root
update(temp.val);
temp = temp.right;//right
}
}
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) res[i] = list.get(i);
return res;
}
public void update(int cur) {
if (pre == cur) count++;
else {
pre = cur;
count = 1;
}
if (count == maxCount) list.add(cur);
if (count > maxCount) {
maxCount = count;
list.clear();
list.add(cur);
}
}
}
4.Morris中序遍历:略。。。