private static BalanceStatusWithHeight CheckBalanced(BinaryTreeNode<Integer> tree) {
    if (tree == null) {
      return new BalanceStatusWithHeight(true, -1); // Base case.
    }

    BalanceStatusWithHeight leftResult = CheckBalanced(tree.getLeft());
    if (leftResult.balanced == false) {
      return leftResult; // Left subtree is not balanced.
    }
    BalanceStatusWithHeight rightResult = CheckBalanced(tree.getRight());
    if (rightResult.balanced == false) {
      return rightResult; // Right subtree is not balanced.
    }

    boolean isBalanced = Math.abs(leftResult.height - rightResult.height) <= 1;
    int height = Math.max(leftResult.height, rightResult.height) + 1;
    return new BalanceStatusWithHeight(isBalanced, height);
  }
  private static boolean areKeysInRange(
      BinaryTreeNode<Integer> tree, Integer lower, Integer upper) {
    if (tree == null) {
      return true;
    } else if (Integer.compare(tree.getData(), lower) < 0
        || Integer.compare(tree.getData(), upper) > 0) {
      return false;
    }

    return areKeysInRange(tree.getLeft(), lower, tree.getData())
        && areKeysInRange(tree.getRight(), tree.getData(), upper);
  }
 public static void main(String[] args) {
   // balanced binary tree test
   // 3
   // 2 5
   // 1 4 6
   BinaryTreeNode<Integer> tree = new BinaryTreeNode<>();
   tree.setLeft(new BinaryTreeNode<Integer>());
   tree.getLeft().setLeft(new BinaryTreeNode<Integer>());
   tree.setRight(new BinaryTreeNode<Integer>());
   tree.getRight().setLeft(new BinaryTreeNode<Integer>());
   tree.getRight().setRight(new BinaryTreeNode<Integer>());
   assert (isBalanced(tree));
   System.out.println(isBalanced(tree));
   tree = new BinaryTreeNode<>();
   tree.setLeft(new BinaryTreeNode<Integer>());
   tree.getLeft().setLeft(new BinaryTreeNode<Integer>());
   assert (!isBalanced(tree));
   System.out.println(isBalanced(tree));
 }
 public static void main(String[] args) {
   // 3
   // 2 5
   // 1 4 6
   BinaryTreeNode<Integer> tree = new BinaryTreeNode<>(3);
   tree.setLeft(new BinaryTreeNode<>(2));
   tree.getLeft().setLeft(new BinaryTreeNode<>(1));
   tree.setRight(new BinaryTreeNode<>(5));
   tree.getRight().setLeft(new BinaryTreeNode<>(4));
   tree.getRight().setRight(new BinaryTreeNode<>(6));
   // should output true.
   assert isBinaryTreeBST(tree);
   System.out.println(isBinaryTreeBST(tree));
   // 10
   // 2 5
   // 1 4 6
   tree.setData(10);
   // should output false.
   assert !isBinaryTreeBST(tree);
   System.out.println(isBinaryTreeBST(tree));
   // should output true.
   assert isBinaryTreeBST(null);
   System.out.println(isBinaryTreeBST(null));
 }