/**
  * Avalia a expressão e retorna o seu valor (resolve a expessão)
  * @param TreeNode|TreeLeaf $treeNode Arvore que será analizada
  * @return float|int|null Resultado da expressão
  */
 public function evaluate($treeNode = null)
 {
     $result = null;
     if ($treeNode == null) {
         $result = $this->treeNode == null ? 0 : $this->evaluate($this->treeNode);
     } else {
         if ($treeNode instanceof TreeLeaf) {
             /**
              * SE é uma folha, então so tem o valor numérico
              */
             $result = $treeNode->getValue();
         } else {
             /**
              * Aqui é nó binário, então existe o lado esquerdo, direito e o operador
              */
             $operator = $treeNode->getOperator();
             /**
              * Chama recursivamente cada lado do nó (que podem ser outros nós)
              */
             $valueLeft = $this->evaluate($treeNode->getLeft());
             $valueRight = $this->evaluate($treeNode->getRight());
             /**
              * Executa as operações
              */
             switch ($operator) {
                 case '+':
                     $result = $valueLeft + $valueRight;
                     break;
                 case '-':
                     $result = $valueLeft - $valueRight;
                     break;
                 case '*':
                     $result = $valueLeft * $valueRight;
                     break;
                 case '/':
                     $result = $valueLeft / $valueRight;
                     break;
                 case '^':
                     $result = $valueLeft ^ $valueRight;
                     break;
             }
         }
     }
     return $result;
 }