0x00 题目
给你一个二叉树的根结点 root
请返回出现次数最多的【子树元素和】
如果有多个元素出现的次数 相同
返回所有出现次数最多的【子树元素和】(不限顺序)
一个结点的「子树元素和」定义为
以该结点为根
的二叉树上所有
结点的元素之和
(包括结点本身)
0x01 思路
子树元素和 = 该节点值 + 左子树和 + 右子树和
要想获取子树和,就得使用后序
遍历的方式
使用字典
存储 值
与 次数
同时记录目前出现的最大次数
最后遍历字典,取出次数最大的 key
即可
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func findFrequentTreeSum(_ root: TreeNode?) -> [Int] {
// 存储 和 与 次数
var dict: [Int:Int] = [:]
var max = 1
func dfs(_ root: TreeNode?) -> Int {
guard let root = root else { return 0 }
// 左子树的和
let left = dfs(root.left)
// 右子树的和
let rihgt = dfs(root.right)
// 总和
let sum = root.val + left + rihgt
// 存在,则加 1
if let val = dict[sum] {
let res = val + 1
dict[sum] = res
// 更新最大次数
if (max < res) {
max = res
}
}else{
dict[sum] = 1
}
return sum
}
// 遍历整棵树
_ = dfs(root)
// 查找最大次数的和
var res: [Int] = []
for (key, val) in dict {
if (val == max) {
res.append(key)
}
}
return res
}
0x03 我的作品
欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手!
App Store
搜索即可~