Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a node is defined as the sum of all the node values formed by the subtree rooted at that node (including the node itself). So what is the most frequent subtree sum value? If there is a tie, return all the values with the highest frequency in any order.
Examples 1
Input:
Input:
5 / \ 2 -3return [2, -3, 4], since all the values happen only once, return all of them in any order.
Examples 2
Input:
Input:
5 / \ 2 -5return [2], since 2 happens twice, however -5 only occur once.
Note: You may assume the sum of values in any subtree is in the range of 32-bit signed integer.
<Solution>想法如下
- 直覺就是用遞回解。過程中,把總合一直往上傳來做計算
- 同時並用一個 hashmap 來記錄每個總合出現的次數,以及目前出現最多次的次數
- 最後根據最大次數,來找出答案
code 如下
Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Definition for a binary tree node. | |
* public class TreeNode { | |
* int val; | |
* TreeNode left; | |
* TreeNode right; | |
* TreeNode(int x) { val = x; } | |
* } | |
*/ | |
class Solution { | |
private int freq = Integer.MIN_VALUE; | |
private HashMap<Integer, Integer> map = new HashMap<>(); | |
public int[] findFrequentTreeSum(TreeNode root) { | |
traverse(root); | |
ArrayList<Integer> ans = new ArrayList<>(); | |
for(Map.Entry<Integer, Integer> entry: map.entrySet()) { | |
if(entry.getValue() == freq) { | |
ans.add(entry.getKey()); | |
} | |
} | |
return ans.stream().mapToInt(Integer::intValue).toArray(); | |
} | |
private int traverse(TreeNode node) { | |
if(node == null) { | |
return 0; | |
} | |
int sum = node.val + traverse(node.left) + traverse(node.right); | |
map.put(sum, map.getOrDefault(sum, 0) + 1); | |
freq = Math.max(freq, map.get(sum)); | |
return sum; | |
} | |
} |
Kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Example: | |
* var ti = TreeNode(5) | |
* var v = ti.`val` | |
* Definition for a binary tree node. | |
* class TreeNode(var `val`: Int) { | |
* var left: TreeNode? = null | |
* var right: TreeNode? = null | |
* } | |
*/ | |
class Solution { | |
val map = mutableMapOf<Int,Int>() | |
var maxFreq = Int.MIN_VALUE | |
fun findFrequentTreeSum(root: TreeNode?): IntArray { | |
dfs(root) | |
val ans = mutableListOf<Int>() | |
for(m in map) { | |
if(m.value == maxFreq) { | |
ans.add(m.key) | |
} | |
} | |
return ans.toIntArray() | |
} | |
fun dfs(root: TreeNode?): Int { | |
if(root == null) { | |
return 0 | |
} | |
val left = dfs(root!!.left) | |
val right = dfs(root!!.right) | |
val sum = root!!.`val` + left + right | |
map[sum] = map[sum]?.let{it+1} ?: 1 | |
maxFreq = Math.max(maxFreq, map[sum]!!) | |
return sum | |
} | |
} |
沒有留言:
張貼留言