1120 子樹的最大平均值
阿新 • • 發佈:2021-02-16
技術標籤:LeetCode
題目描述:
給你一棵二叉樹的根節點 root,找出這棵樹的 每一棵 子樹的 平均值 中的 最大 值。
子樹是樹中的任意節點和它的所有後代構成的集合。
樹的平均值是樹中節點值的總和除以節點數。
示例:
輸入:[5,6,1]
輸出:6.00000
解釋:
以 value = 5 的節點作為子樹的根節點,得到的平均值為 (5 + 6 + 1) / 3 = 4。
以 value = 6 的節點作為子樹的根節點,得到的平均值為 6 / 1 = 6。
以 value = 1 的節點作為子樹的根節點,得到的平均值為 1 / 1 = 1。
所以答案取最大值 6。
提示:
樹中的節點數介於 1 到 5000之間。
如果結果與標準答案的誤差不超過 10^-5,那麼該結果將被視為正確答案。
方法1:
主要思路:解題彙總連結
(1)後序遍歷,儲存過程中的最大平均值;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
pair<int,int> post_order(TreeNode*root,double&res){
if(root==NULL){
return {0,0};
}
pair<int,int> left_res=post_order(root->left,res);
pair<int,int>right_res=post_order(root->right,res);
//當前結點的狀態,first是子樹的和,second是子樹結點的個數
pair<int,int> cur_res={left_res.first+right_res.first+root->val,left_res.second+right_res.second+1};
res=max(res,1.0*cur_res.first/cur_res.second);//處理當前可能的更大的平均值
return cur_res;
}
double maximumAverageSubtree(TreeNode* root) {
double res=0;
post_order(root,res);
return res;
}
};