/** {@inheritDoc} */
  @Override
  protected boolean validateNode(Node<T> node) {
    boolean bst = super.validateNode(node);
    if (!bst) return false;

    AVLNode<T> avlNode = (AVLNode<T>) node;
    int balanceFactor = avlNode.getBalanceFactor();
    if (balanceFactor > 1 || balanceFactor < -1) {
      return false;
    }
    if (avlNode.isLeaf()) {
      if (avlNode.height != 1) return false;
    } else {
      AVLNode<T> avlNodeLesser = (AVLNode<T>) avlNode.lesser;
      int lesserHeight = 1;
      if (avlNodeLesser != null) lesserHeight = avlNodeLesser.height;

      AVLNode<T> avlNodeGreater = (AVLNode<T>) avlNode.greater;
      int greaterHeight = 1;
      if (avlNodeGreater != null) greaterHeight = avlNodeGreater.height;

      if (avlNode.height == (lesserHeight + 1) || avlNode.height == (greaterHeight + 1))
        return true;
      return false;
    }

    return true;
  }