当前位置: 面试刷题>> 出现频率最高的子树和 (经典算法题500道)
### 题目描述补充
**题目:出现频率最高的子树和**
给定一个二叉树,树的每个节点上都含有一个整数值。我们定义子树和为该节点本身的值加上其所有子节点的值之和。你需要找出这棵树中所有不同子树和中出现频率最高的那个子树和,并返回其出现频率。如果有多个子树和的频率相同且都是最高的,则返回其中任意一个即可。
**注意**:
- 树中的节点数不会超过500。
- 每个节点的值都是整数,范围在 [-10000, 10000] 之间。
### 示例
假设给定的树如下:
```
5
/ \
2 -5
```
- 子树和为 2 的有 1 个(单独的节点 2)。
- 子树和为 -5 的有 1 个(单独的节点 -5)。
- 子树和为 2 - 5 = -3 的有 1 个(节点 2 及其右子节点 -5)。
- 子树和为 5 + 2 + (-5) = 2 的有 1 个(整棵树)。
因此,出现频率最高的子树和是 2(出现 1 次)和 -3(出现 1 次),返回其中任意一个的频率 1。
### PHP 示例代码
```php
class TreeNode {
public $val;
public $left;
public $right;
function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}
function findFrequentTreeSum($root) {
$freqMap = [];
dfs($root, $freqMap);
$maxFreq = 0;
$maxSum = null;
foreach ($freqMap as $sum => $freq) {
if ($freq > $maxFreq) {
$maxFreq = $freq;
$maxSum = $sum;
}
}
return $maxFreq;
}
function dfs($node, &$freqMap) {
if ($node === null) return 0;
$sum = $node->val + dfs($node->left, $freqMap) + dfs($node->right, $freqMap);
$freqMap[$sum] = isset($freqMap[$sum]) ? $freqMap[$sum] + 1 : 1;
return $sum;
}
// 示例用法
$root = new TreeNode(5);
$root->left = new TreeNode(2);
$root->right = new TreeNode(-5);
echo findFrequentTreeSum($root); // 输出 1
```
### Python 示例代码
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def findFrequentTreeSum(root):
freq_map = {}
def dfs(node):
if not node:
return 0
total_sum = node.val + dfs(node.left) + dfs(node.right)
freq_map[total_sum] = freq_map.get(total_sum, 0) + 1
return total_sum
dfs(root)
max_freq = max(freq_map.values())
return max_freq
# 示例用法
root = TreeNode(5)
root.left = TreeNode(2)
root.right = TreeNode(-5)
print(findFrequentTreeSum(root)) # 输出 1
```
### JavaScript 示例代码
```javascript
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
function findFrequentTreeSum(root) {
let freqMap = {};
function dfs(node) {
if (!node) return 0;
let sum = node.val + dfs(node.left) + dfs(node.right);
if (freqMap[sum]) {
freqMap[sum]++;
} else {
freqMap[sum] = 1;
}
return sum;
}
dfs(root);
let maxFreq = 0;
for (let freq of Object.values(freqMap)) {
if (freq > maxFreq) {
maxFreq = freq;
}
}
return maxFreq;
}
// 示例用法
const root = new TreeNode(5);
root.left = new TreeNode(2);
root.right = new TreeNode(-5);
console.log(findFrequentTreeSum(root)); // 输出 1
```
**码小课网站中有更多相关内容分享给大家学习**,包括数据结构、算法、面试技巧等,欢迎访问学习!