1.タイトル
2.アイデア(Java言語での説明)
ミドルオーダートラバーサルプロセス中にMaxを記録し、すべてのノードをMapでマップし、最後にMapをトラバースして、条件を満たすキーを選択します。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
int max = 0;
public int[] findMode(TreeNode root) {
centerOrder(root,map);
return mapToIntegerArray(map);
}
public void centerOrder(TreeNode root,Map<Integer,Integer> map){
if(root!=null){
centerOrder(root.left,map);
int speed = map.getOrDefault(root.val,0)+1;
if(max<speed){
max = speed;
}
map.put(root.val,speed);
centerOrder(root.right,map);
}
}
public int[] mapToIntegerArray(Map<Integer,Integer> map){
if(map == null){
return null;
}
Iterator<Map.Entry<Integer,Integer>> entries = map.entrySet().iterator();
ArrayList<Integer> list = new ArrayList<Integer>();
while(entries.hasNext()){
Map.Entry<Integer,Integer> entry = entries.next();
int tmp = entry.getValue();
if(tmp == max){
list.add(entry.getKey());
}
}
int[] result = new int[list.size()];
int cnt=0;
for(Integer num:list){
result[cnt++] = num.intValue();
}
return result;
}
}
3.マップに関する知識ポイントのレビュー
1.マップをトラバースする最も効率的な方法は、イテレータを使用してトラバースすることです。
Iterator<Map.Entry<Integer,Integer>> entries = map.entrySet().iterator();
while(entries.hasNext()){
Map.Entry<Integer,Integer> entry = entries.next();
System.out.println("key: "+entry.getKey()+", value: "+entry.getValue());
}
2.map.getOrDefault()
//如果map中有存储key的value,则 temp = map.get(key)
//否则 temp = 0;
int temp = map.getOrDefault(key,0);