package com.anuragkapur.ctci; import com.anuragkapur.ds.tree.TreeFactory; import com.anuragkapur.ds.tree.TreeNode; import java.util.LinkedList; import java.util.Queue; /** * @author: anuragkapur * @since: 09/05/2014 */ public class Prob4_1_IsTreeBalanced { public static boolean isTreeBalanced(TreeNode rootNode) { // breadth first traversal of tree Queue<TreeNode> queue = new LinkedList<>(); queue.add(rootNode); while(queue.peek() != null) { TreeNode currentNode = queue.poll(); TreeNode leftNode = currentNode.getLeft(); TreeNode rightNode = currentNode.getRight(); int leftSubTreeHeight = getHeight(leftNode); int rightSubTreeHeight = getHeight(rightNode); int heightDifference = leftSubTreeHeight - rightSubTreeHeight; if(heightDifference > 1 || heightDifference < -1) { return false; } queue.add(leftNode); queue.add(rightNode); } return true; } private static int getHeight(TreeNode node) { if(node == null) return -1; int leftHeight = getHeight(node.getLeft()); int rightHeight = getHeight(node.getRight()); return(Math.max(leftHeight, rightHeight) + 1); } public static void main(String[] args) { System.out.println("Expected :: true :: Actual :: " + isTreeBalanced(TreeFactory.getBalancedBinaryTree())); System.out.println("Expected :: false :: Actual :: " + isTreeBalanced(TreeFactory.getUnBalancedBinaryTree())); } }