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