描述
给一棵二叉树,找到有最大平均值的子树。返回子树的根结点
样例
样例 1
输入:
1
/
-5 11
/ \ /
1 2 4 -2
输出:11(它是一个TreeNode)
样例 2
输入:
1
/
-5 11
输出:11(它是一个TreeNode)
思考
使用一个函数来遍历这个二叉树。
根据后根遍历的顺序遍历每个节点,用左右子树的和来计算根的和,并且一直保存一个最大的平均数。如果左右子树没有节点,那么根直接返回自己的值,和大小为1。
代码
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: the root of binary tree
* @return: the root of the maximum average of subtree
*/
TreeNode * findSubtree2(TreeNode * root) {
// write your code here
if (!root || (!root->left && !root->right))
return root;
double maxAvg = INT_MIN;
TreeNode *maxNode = NULL;
int size = 0;
recur(root,maxNode, size, maxAvg);
return maxNode;
}
double recur(TreeNode *node, TreeNode * &maxNode, int &size, double& maxAvg) {
if (!node) return 0;
int leftSize = 0, rightSize = 0;
double leftAvg,rightAvg;
leftAvg = recur(node->left, maxNode, leftSize, maxAvg);
rightAvg = recur(node->right, maxNode, rightSize, maxAvg);
size = leftSize+rightSize+1;
double Avg = (leftAvg * leftSize + rightAvg * rightSize + node->val)/(double)size;
if (Avg > maxAvg) {
maxAvg = Avg;
maxNode = node;
}
return Avg;
}
};