Average of Levels in Binary Tree | Tree Problem
4 years ago Lalit Bhagtani 0
Problem Statement
You have given a binary tree, return the average of all the nodes values on each level in the form of a list.
Example
Average value of nodes on level 0 is 3, on level 1 is 14.5, on level 2 is 7.5 and on level 3 is 4.6. So result is [3, 14.5, 7.5, 4.6].
Algorithm
The level order traversal algorithm can be used to solve this problem. Level order traversal can be implemented by using standard tree algorithms like depth first search and breadth first search.
Breadth First Search
package com.leetcode.subscribe; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class AverageOfLevels { public static void main(String[] args) { AverageOfLevels pot = new AverageOfLevels(); TreeNode node = new TreeNode(3); node.left = new TreeNode(9); node.right = new TreeNode(20); node.left.left = new TreeNode(2); node.left.right = new TreeNode(6); TreeNode node1 = new TreeNode(15); TreeNode node2 = new TreeNode(7); node.right.left = node1; node.right.right = node2; node1.left = new TreeNode(5); node1.right = new TreeNode(8); node2.right = new TreeNode(1); List<Double> result = pot.averageOfLevels(node); for(Double i : result) { System.out.print(i+", "); } } public List<Double> averageOfLevels(TreeNode root) { List<Double> result = new ArrayList<>(); if(root == null){ return result; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); int size = 0, i = 0; double sum = 0; while(queue.size() > 0){ sum = 0; size = queue.size(); for(i = 0; i < size; i++){ root = queue.poll(); sum = sum + (double)root.val; if(root.left != null) queue.add(root.left); if(root.right != null) queue.add(root.right); } result.add(sum/size); } return result; } public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }
Depth First Search
import java.util.ArrayList; import java.util.List; public class AverageOfLevels { public static void main(String[] args) { AverageOfLevels pot = new AverageOfLevels(); TreeNode node = new TreeNode(3); node.left = new TreeNode(9); node.right = new TreeNode(20); node.left.left = new TreeNode(2); node.left.right = new TreeNode(6); TreeNode node1 = new TreeNode(15); TreeNode node2 = new TreeNode(7); node.right.left = node1; node.right.right = node2; node1.left = new TreeNode(5); node1.right = new TreeNode(8); node2.right = new TreeNode(1); List<Double> result = pot.averageOfLevels(node); for(Double i : result) { System.out.print(i+", "); } } public List<Double> averageOfLevels(TreeNode root) { List<Double> result = new ArrayList<>(); if(root == null){ return result; } List<Double> sum = new ArrayList<>(); List<Double> count = new ArrayList<>(); dfs(root, 0, sum, count); for(int i=0; i<sum.size(); i++){ result.add(sum.get(i)/count.get(i)); } return result; } public void dfs(TreeNode node, int level, List<Double> sum, List<Double> count){ if(node == null) return; if(sum.size() == level){ sum.add(0.0); count.add(0.0); } sum.set(level, sum.get(level) + node.val); count.set(level, count.get(level) + 1); dfs(node.left, level+1, sum, count); dfs(node.right, level+1, sum, count); } public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }
Result
3.0, 14.5, 7.5, 4.666666666666667,
Similar Post
That’s all for Average of Levels in binary tree in Java, If you liked it, please share your thoughts in a comments section and share it with others too.