4.1 Balanced binary tree

Implement a function to check if a binary tree i balanced. For the purposes of this question, a balanced tree is defined to be a tree such that the heights of the two subtrees of any node never differ by more than one

import scala.collection.mutable

trait BTree

object Empty extends BTree

case class Node(var value: Int, var left: BTree = Empty, var right: BTree = Empty) extends BTree

def printBTree(root: BTree): Unit = {
  val queue = mutable.Queue[(BTree, Int)]((root, 0))
  var prev = -1
  while (!queue.isEmpty) {
    val (node, level) = queue.dequeue()
    node match {
      case n: Node => {
        if (level != prev) {
          print("\n#")
          prev = level
        }
        print(n.value)
        queue.enqueue((n.left, level + 1))
        queue.enqueue((n.right, level + 1))
      }
      case _ =>
    }
  }
}

/**
  * 4.1
  *
  * @param root
  * @return
  */
def isBalanced(root: BTree): Boolean = {
  def depth(node: BTree): Int = {
    node match {
      case Empty => 0
      case n: Node => {
        val (left, right) = (depth(n.left), depth(n.right))
        if (left == -1 || right == -1 || math.abs(left - right) > 1) -1
        else (left max right) + 1
      }
    }
  }
  depth(root) != -1
}

val a = Node(1, Empty, Empty)
val b = Node(2, Empty, Empty)
val c = Node(3, a, b)

isBalanced(Empty)
isBalanced(c)

val e = Node(4, Empty, a)
val d = Node(5, Empty, e)
val f = Node(5, Empty, d)

isBalanced(f)