Subtree with Maximum Average
Important: using a/b < c/d => a*d < c*b to check, we don't need to do the type transfer
For the tree, if we need to get the max/min tree node, it is better to have a global variouable to remember it => traverse + divided conquer
1) Traverse + Divided conquer version
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ class ResultType { private int sum; private int size; public ResultType(int sum, int size) { this.sum = sum; this.size = size; } public int getSum() { return sum; } public int getSize() { return size; } } public class Solution { /** * @param root the root of binary tree * @return the root of the maximum average of subtree */ private double maxAvg = Double.NEGATIVE_INFINITY; private TreeNode maxNode = null; public TreeNode findSubtree2(TreeNode root) { // Write your code here findMaxAvg(root); return maxNode; } ResultType findMaxAvg(TreeNode root) { if (root == null) { return new ResultType(0, 0); } ResultType left = findMaxAvg(root.left); ResultType right = findMaxAvg(root.right); int sum = left.getSum() + right.getSum() + root.val; int size = left.getSize() + right.getSize() + 1; double avg = sum / (double)size; if (avg > maxAvg) { maxAvg = avg; maxNode = root; } return new ResultType(sum, size); } }
2) Divided Conquer
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root the root of binary tree * @return the root of the maximum average of subtree */ private class ResultType { public int sum; public int nums; public int maxSum; public int maxNums; public TreeNode maxNode; public ResultType (int sum, int nums, int maxSum, int maxNums, TreeNode maxNode) { this.sum = sum; this.nums = nums; this.maxSum = maxSum; this.maxNums = maxNums; this.maxNode = maxNode; } } public TreeNode findSubtree2(TreeNode root) { // Write your code here if (root == null) { return root; } return findMaxAvg(root).maxNode; } private ResultType findMaxAvg(TreeNode root) { if (root == null) { return new ResultType(0, 0, Integer.MIN_VALUE, 0, root); } ResultType left = findMaxAvg(root.left); ResultType right = findMaxAvg(root.right); int sum = left.sum + right.sum + root.val; int nums = left.nums + right.nums + 1; int maxSum = sum; int maxNums = nums; TreeNode maxNode = root; if (maxSum * left.maxNums < left.maxSum * maxNums) { maxSum = left.maxSum; maxNums = left.maxNums; maxNode = left.maxNode; } if (maxSum * right.maxNums < right.maxSum * maxNums) { maxSum = right.maxSum; maxNums = right.maxNums; maxNode = right.maxNode; } return new ResultType(sum, nums, maxSum, maxNums, maxNode); } }
posted on 2017-06-01 08:29 codingEskimo 阅读(84) 评论(0) 编辑 收藏 举报