1120/9_597. 具有最大平均数的子树 · subtree_with_maximum_average
给一棵二叉树,找到有最大平均值的子树。
返回子树的根结点(Lint)/ 最大平均值(Leet)。
说明:
Q9_597: LintCode会打印出根结点为你返回节点的子树,保证有最大平均数子树只有一棵。
Q1120: LeetCode直接返回MaxAvg.
提示:
树中的节点数介于 1 到 5000之间。
每个节点的值介于 0 到 100000 之间。
如果结果与标准答案的误差不超过 10^-5,那么该结果将被视为正确答案。
例1:
输入:
{1,-5,11,1,2,4,-2}
输出:11
说明:
这棵树如下所示:
1
/ \
-5 11
/ \ / \
1 2 4 -2
11子树的平均值是4.333,为最大的
例2:
输入:
{1,-5,11}
输出:11
说明:
1
/ \
-5 11
1,-5,11 三棵子树的平均值分别是 2.333,-5,11。因此11才是最大的
解题思路:
树型问题首先考虑递归。通过前序遍历访问整颗二叉树,每次返回当前整个树的所有节点和和节点个数。那么当前树的所有节点和就是左子树的所有节点和加上右子树的所有节点和再加上树根值。而当前树的节点个数就是左子树的节点个数加上右子树的节点个数再加上1(root)。
(1)Py – q1120(直接返回MaxVal)
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
class q1120_subtree_with_maximum_average:
def maxAvgSubtree(self, root: TreeNode) -> float:
avg = 0.0
def dfs(root): # 返回subtreeSum, n_nodes
nonlocal avg # 非局部/全局变量,而是【外部嵌套函数内的变量】
if root is None:
return 0, 0
# zip = [当前子树和, 当前节点总数]
l_zip, r_zip = dfs(root.left), dfs(root.right)
curSum, n_nodes = l_zip[0] + r_zip[0] + root.val,\
l_zip[1] + r_zip[1] + 1
avg = max(avg, curSum / n_nodes)
return curSum, n_nodes
dfs(root)
return avg
(2) Py – Q9_597(返回最大平均值子树的根节点)
class q9_597_subtree_with_maximum_average:
avg, resRoot = 0.0, None
def findSubtree2(self, root: TreeNode) -> float:
self.helper(root)
return self.resRoot
def helper(self, root): # 返回curSum, n_nodes
# global avg, resRoot
if root is None:
return 0, 0
# zip = [curSum, n_nodes]
l_zip, r_zip = self.helper(root.left), self.helper(root.right)
curSum, n_nodes = l_zip[0] + r_zip[0] + root.val,\
l_zip[1] + r_zip[1] + 1
curAvg = curSum * 1.0 / n_nodes
# self.avg = max(self.avg, curSum * 1.0 / n_nodes)
if self.resRoot is None or self.avg < curAvg:
self.resRoot = root
self.avg = curAvg
return curSum, n_nodes