LeetCode 501
2020.8.16
我的通过代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int current = 0; //当前遍历到的这个数字出现的次数
int ret = 0; //众数的个数
int max = 0; //众数出现的次数
int[] retArray; //返回用的数组
TreeNode node = null; //指向上一个节点,这样可以得知从一个数变为下一个数的过程
public int[] findMode(TreeNode root) {
traverse(root);
retArray = new int[ret];
current = 0;
ret = 0;
node = null;
traverse(root);
return retArray;
}
//中序遍历
void traverse(TreeNode root) {
if(root==null) return;
traverse(root.left);
if(node!=null&&node.val==root.val) {
current++;
} else current = 0;
if(current>max) {
max = current;
ret = 1; //新王登基!
} else if(current==max) {
//一山容二虎了
if(retArray!=null) {
retArray[ret] = root.val;
}
ret++;
}
node = root;
traverse(root.right);
}
}
这道题题目给了个小要求,除了最后return用的那个数组,不要开辟别的空间。
这就稍微有点麻烦了,因为我们既要知道众数有几个,还要知道它们是谁,这的确很难在一次遍历中全部得到。
一次不行,咱们就来两次。
第一次中序遍历计算众数的个数,有了这个个数我们才能初始化记录众数元素的数组,这样再做一次中序遍历就可以记录下来它们是谁了。
要点
循环中,current表示node指向的这个节点的数字出现的次数,那么在数字切换的时候,一定要把current还原为0.
第二次遍历主要是为了将众数记录进retArray数组,那么max是不需要重新归零的,如果归零了就无法第一时间将众数记录进数组了,因为当发现那个数是众数的时候,循环已经结束了。