★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-oksmtcsw-me.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
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.node
Examples 1
Input:git
5 / \ 2 -3
return [2, -3, 4], since all the values happen only once, return all of them in any order. github
Examples 2
Input:微信
5 / \ 2 -5
return [2], since 2 happens twice, however -5 only occur once. app
Note: You may assume the sum of values in any subtree is in the range of 32-bit signed integer.post
給出二叉樹的根,找出出現次數最多的子樹元素和。一個結點的子樹元素和定義爲以該結點爲根的二叉樹上全部結點的元素之和(包括結點自己)。而後求出出現次數最多的子樹元素和。若是有多個元素出現的次數相同,返回全部出現次數最多的元素(不限順序)。 spa
示例 1
輸入:code
5 / \ 2 -3
返回 [2, -3, 4],全部的值均只出現一次,以任意順序返回全部值。orm
示例 2
輸入:
5 / \ 2 -5
返回 [2],只有 2 出現兩次,-5 只出現 1 次。
提示: 假設任意子樹元素和都可以用 32 位有符號整數表示。
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 16 var res:[Int] = [Int]() 17 var m:[Int:Int] = [Int:Int]() 18 var cnt:Int = 0 19 postorder(root, &m, &cnt) 20 for (key,val) in m 21 { 22 if val == cnt 23 { 24 res.append(key) 25 } 26 } 27 return res 28 } 29 30 func postorder(_ node: TreeNode?,_ m:inout [Int:Int],_ cnt:inout Int) -> Int 31 { 32 if node == nil {return 0} 33 var left:Int = postorder(node!.left, &m, &cnt) 34 var right:Int = postorder(node!.right, &m, &cnt) 35 var sum = left + right + node!.val 36 if m[sum] == nil 37 { 38 m[sum] = 1 39 } 40 else 41 { 42 m[sum]! += 1 43 } 44 cnt = max(cnt, m[sum]!) 45 return sum 46 } 47 }
64ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 16 var result = [Int:Int]() 17 _ = _findFrequentTreeSum(root, &result) 18 19 let maxRepeat = result.values.max() ?? 0 20 21 return result.compactMap { key,value in 22 guard value == maxRepeat else { return nil } 23 return key 24 } 25 } 26 27 func _findFrequentTreeSum(_ root: TreeNode?, 28 _ result: inout [Int:Int]) -> Int 29 { 30 guard let root = root else { return 0 } 31 32 var value = root.val 33 value += _findFrequentTreeSum(root.left, &result) 34 value += _findFrequentTreeSum(root.right, &result) 35 36 result[value] = (result[value] ?? 0) + 1 37 38 return value 39 } 40 }
76ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 16 guard let root = root else { return [] } 17 18 var counter = [Int : Int]() 19 func dfs(_ node: TreeNode?) -> Int { 20 guard let node = node else { return 0 } 21 let s = node.val + dfs(node.left) + dfs(node.right) 22 counter[s, default: 0] += 1 23 return s 24 } 25 26 dfs(root) 27 let kvs = counter.sorted(by: {$0.1 > $1.1}) 28 let freq = kvs[0].value 29 var ret = [Int]() 30 for (s, f) in kvs { 31 if f == freq { 32 ret.append(s) 33 } 34 } 35 return ret 36 } 37 }
84ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 var mp = [Int: Int]() 16 17 func postorder(_ root: TreeNode?) -> Int{ 18 if (root == nil) { 19 return 0; 20 } 21 22 let left = postorder(root?.left); 23 let right = postorder(root?.right); 24 25 let sum = (root?.val)! + left + right; 26 27 if mp[sum] != nil { 28 mp[sum]! += 1 29 } else { 30 mp[sum] = 1 31 } 32 return sum; 33 } 34 35 36 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 37 postorder(root) 38 print(mp) 39 var fq = [Int]() 40 var max = Int.min 41 for number in mp.values { 42 if max < number { 43 max = number 44 } 45 } 46 47 for (i,number) in mp { 48 if max == number { 49 fq.append(i) 50 } 51 } 52 53 return fq 54 } 55 }
104ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 class Solution { 15 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 16 var map = [Int: Int]() 17 traverse(root, &map) 18 19 var result = [Int]() 20 var max = 0 21 for (sum, count) in map { 22 if count == max { 23 result.append(sum) 24 } else if count > max { 25 result.removeAll() 26 max = count 27 result.append(sum) 28 } 29 } 30 return result 31 } 32 33 private func traverse(_ node: TreeNode?, _ map: inout [Int: Int]) -> Int { 34 guard let node = node else { return 0 } 35 36 let sum = node.val + traverse(node.left, &map) + traverse(node.right, &map) 37 map[sum, default: 0] += 1 38 39 return sum 40 } 41 }
108ms
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * public var val: Int 5 * public var left: TreeNode? 6 * public var right: TreeNode? 7 * public init(_ val: Int) { 8 * self.val = val 9 * self.left = nil 10 * self.right = nil 11 * } 12 * } 13 */ 14 15 class Solution { 16 17 func recordSubTreeSums(_ root: TreeNode?, _ subTreeSumMap: inout Dictionary<Int, Int>) -> Int { 18 19 guard let node = root else { return 0 } 20 21 let subTreeSum = recordSubTreeSums(node.left, &subTreeSumMap) + 22 recordSubTreeSums(node.right, &subTreeSumMap) + 23 node.val 24 25 if let count = subTreeSumMap[subTreeSum] { 26 subTreeSumMap[subTreeSum] = count + 1 27 } else { 28 subTreeSumMap[subTreeSum] = 1 29 } 30 31 return subTreeSum 32 } 33 34 func findFrequentTreeSum(_ root: TreeNode?) -> [Int] { 35 36 var subTreeSumMap:Dictionary<Int, Int> = [:] 37 var result:[Int] = [] 38 39 recordSubTreeSums(root, &subTreeSumMap) 40 41 var maxCount = -1 42 43 for key in subTreeSumMap.keys { 44 if let count = subTreeSumMap[key] { 45 if (count > maxCount) { maxCount = count } 46 } 47 } 48 49 for key in subTreeSumMap.keys { 50 if let count = subTreeSumMap[key] { 51 if (count == maxCount) { result = result + [key] } 52 } 53 } 54 55 return result 56 } 57 }