1. 程式人生 > 其它 >1120 子樹的最大平均值

1120 子樹的最大平均值

技術標籤: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之間。

每個節點的值介於 0 到 100000 之間。
如果結果與標準答案的誤差不超過 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; } };