package problems.easy;
import problems.utils.TreeNode;
/**
* Created by sherxon on 2016-12-30.
*/
// there are 3 ways to break recursion stack
//1) return magic number like below example(-1)
//2) throw exception
//3) use global variable and discard whenever global variable changed
public class BalancedBinaryTree {
// first way using global variable
boolean b=true;
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
size(root);
return b;
}
int size(TreeNode x){
if(x==null)return 0;
int ls=size(x.left);
int rs=size(x.right);
if(Math.abs(ls-rs)>1)b=false;
return Math.max(ls, rs)+1;
}
// second way return magic number
public boolean isBalanced2(TreeNode root) {
if(root == null) return true;
return dfs(root)!=-1;
}
private int dfs(TreeNode root) {
if(root==null)return 0;
int leftsize=dfs(root.left);
if(leftsize==-1)return -1;
int rightsize=dfs(root.right);
if(rightsize==-1)return -1;
if(Math.abs(rightsize-leftsize)>1)return -1;
return Math.max(leftsize, rightsize)+1;
}
public boolean isBalanced3(TreeNode root) {
if (root == null) return true;
int left = height(root.left);
int right = height(root.right);
return Math.abs(left - right) < 2 && isBalanced3(root.left) && isBalanced3(root.right);
}
int height(TreeNode x) {
if (x == null) return 0;
return Math.max(height(x.left), height(x.right)) + 1;
}
}