501. 二叉搜索树中的众数
思路:
实际上很简单的一个题目,但是我错了一次又一次,所以再记录下:
最初版本count被我初始化成0了,然而应该初始化为1,因为每个数字默认个数为1:
TreeNode pre = null;
int count = 1;
int lastcount = -1;
//TreeNode lastpre = null;
List<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
if(root == null) return new int[]{};
inOrder(root);
System.out.println(list.size());
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);
if(pre == null){
pre = root;
}else{
if(pre.val == root.val){
count++;
if(count == lastcount){
System.out.println(root.val);
list.add(root.val);
}else if(count > lastcount){
list.clear();
System.out.println(root.val);
list.add(root.val);
lastcount = count;
}
}else{
pre = root;
count = 1;
}
}
inOrder(root.right);
}
但是还是不对,因为
if(count == lastcount){
System.out.println(root.val);
list.add(root.val);
}else if(count > lastcount){
list.clear();
System.out.println(root.val);
list.add(root.val);
lastcount = count;
}
这个部分只出现在了当pre.val == root.val的情况,那如果一开始数组只有一个元素,那这个元素永远无法被加进数组了,所以我们直接在判断的每个地方都加上这部分:
TreeNode pre = null;
int count = 1;
int lastcount = -1;
//TreeNode lastpre = null;
List<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
if(root == null) return new int[]{};
inOrder(root);
System.out.println(list.size());
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);
if(pre == null){
pre = root;
if(count == lastcount){
System.out.println(root.val);
list.add(root.val);
}else if(count > lastcount){
list.clear();
System.out.println(root.val);
list.add(root.val);
lastcount = count;
}
}else{
if(pre.val == root.val){
count++;
if(count == lastcount){
System.out.println(root.val);
list.add(root.val);
}else if(count > lastcount){
list.clear();
System.out.println(root.val);
list.add(root.val);
lastcount = count;
}
}else{
pre = root;
count = 1;
if(count == lastcount){
System.out.println(root.val);
list.add(root.val);
}else if(count > lastcount){
list.clear();
System.out.println(root.val);
list.add(root.val);
lastcount = count;
}
}
}
inOrder(root.right);
}
这样看着还是优点冗余,提取成公共部分即可:
TreeNode pre = null;
int count = 1;
int lastcount = -1;//0也可以
//TreeNode lastpre = null;
List<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
if(root == null) return new int[]{};
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);
if(pre == null){
pre = root;
}else{
if(pre.val == root.val){
count++;
}else{
pre = root;
count = 1;
}
}
if(count == lastcount){
list.add(root.val);
}else if(count > lastcount){
list.clear();
list.add(root.val);
lastcount = count;
}
inOrder(root.right);
}