当前位置: 面试刷题>> 具有最大平均数的子树 (经典算法题500道)


### 题目描述 给定一个无向树(每个节点最多有一个父节点,但可以有多个子节点),树的节点上带有权重(可以是正数、负数或零)。你的任务是找到树中具有最大平均权重的子树。子树是指树中的一个节点及其所有后代组成的树结构。 平均权重定义为子树中所有节点的权重之和除以子树中的节点数量(包括该子树的根节点)。 ### 示例 考虑以下树结构,每个节点旁边的数字表示其权重: ``` 1 / \ 2 -3 / \ 4 5 ``` - 子树 `{1}` 的平均权重为 `1/1 = 1` - 子树 `{2, 4, 5}` 的平均权重为 `(2+4+5)/3 = 3.67` - 子树 `{1, 2, 4, 5}` 的平均权重为 `(1+2+4+5)/4 = 3` - 子树 `{1, -3}` 的平均权重为 `(1-3)/2 = -1` - 子树 `{-3}` 的平均权重为 `-3/1 = -3` 因此,具有最大平均权重的子树是 `{2, 4, 5}`,其平均权重为 3.67。 ### PHP 代码示例 ```php class TreeNode { public $val; public $children; function __construct($val = 0, $children = []) { $this->val = $val; $this->children = $children; } } function findSubtreeWithMaxAverage($root) { $maxAvg = PHP_INT_MIN; $maxSubtree = null; function dfs($node, &$sum, &$count, &$maxAvg, &$maxSubtree) { if (!$node) return [0, 0]; $nodeSum = $node->val; $nodeCount = 1; foreach ($node->children as $child) { [$childSum, $childCount] = dfs($child, $sum, $count, $maxAvg, $maxSubtree); $nodeSum += $childSum; $nodeCount += $childCount; } $avg = $nodeSum / $nodeCount; if ($avg > $maxAvg) { $maxAvg = $avg; $maxSubtree = $node; } return [$nodeSum, $nodeCount]; } dfs($root, $sum, $count, $maxAvg, $maxSubtree); // 返回最大平均权重的子树根节点,或者根据需要返回其他信息 return $maxSubtree; } // 示例使用 $root = new TreeNode(1); $root->children = [ new TreeNode(2, [ new TreeNode(4), new TreeNode(5) ]), new TreeNode(-3) ]; $result = findSubtreeWithMaxAverage($root); // 假设有方法打印树节点,这里仅返回根节点作为示例 echo "Root of the subtree with max average: " . $result->val; ``` 注意:由于PHP标准库中没有直接表示树结构的类,上述代码自定义了一个`TreeNode`类来模拟。 ### Python 和 JavaScript 代码示例 由于篇幅限制,Python 和 JavaScript 的实现逻辑与 PHP 类似,但语言语法会有所不同。在 Python 中,你可以使用类和列表来模拟树和子节点。在 JavaScript 中,你可以使用对象和数组来实现相似的结构。这些语言都有更丰富的库来处理数据结构,但基本逻辑(深度优先搜索和记录最大平均值)是相似的。 **码小课网站中有更多相关内容分享给大家学习**,包括更高效的树遍历算法、递归与迭代实现、以及其他数据结构和算法的高级主题。
推荐面试题