public static Question generate()
    {
        List <RandNode> opdNodes    = new List <RandNode> ();
        List <RandNode> oprNodes    = new List <RandNode> ();
        string          questionStr = "";
        RandNode        rn          = getOpd(GlobalSettings.largestNum);

        opdNodes.Add(rn);
        questionStr += rn.number.ToString();

        for (int i = 0; i < GlobalSettings.numberOfOperators - 1; i++)
        {
            RandNode opr = getOps();

            /** Deal with divide, we only want integer for dividen **/
            RandNode opd;
            if (opr.type == QTree.Type.Div)
            {
                opd = getValidDivisor(getPrevDiv(oprNodes, opdNodes, opdNodes.Count - 1));
            }
            else
            {
                opd = getOpd(GlobalSettings.largestNum);
            }

            //Add them in
            opdNodes.Add(opd);
            oprNodes.Add(opr);
            questionStr += " " + QTree.getOperatorStr(opr.type) + " " + opd.number.ToString();
        }


        //Debug.Log (questionStr);
        QTree root        = QTreeBuilder.build(opdNodes, oprNodes);
        int   rightAnswer = (int)root.evaluate();

        int    score        = getScore(root);
        string explaination = getExplaination(root);

        Debug.Log("Explaination " + explaination + ", " + score);
        Question question = new Question(questionStr, rightAnswer, score, explaination);


        //Debug.Log ("The correct answer is " + question.answer.ToString ());
        return(question);
    }
    /*
     * 5 + 6 * 3 / 2 - 3
     * =5 + 18 / 2 - 3
     * =5 + 9 -3
     * =14 - 3
     * =11
     *  BFS to a stack, then pop out
     *
     */


    private static string getExplaination(QTree root)
    {
        Stack <string> exp = new Stack <string> ();
        //bfs
        Stack <QTreeExt> nodes = new Stack <QTreeExt>();

        nodes.Push(new QTreeExt(root, false));
        while (nodes.Count > 0)
        {
            Stack <QTreeExt> nextLevel = new Stack <QTreeExt> ();
            string           levelRes  = "";
            while (nodes.Count > 0)
            {
                QTreeExt qt = nodes.Pop();
                if (qt.isVisited)
                {
                    levelRes += QTree.getOperatorStr(qt.type);
                }
                else
                {
                    levelRes += qt.evaluate();
                    if (qt.left != null && qt.right != null)
                    {
                        nextLevel.Push(new QTreeExt(qt.left, false));
                        nextLevel.Push(new QTreeExt(qt, true));                          //make sure we don't visit this again
                        nextLevel.Push(new QTreeExt(qt.right, false));
                    }
                }
            }
            nodes = nextLevel;
            exp.Push(levelRes);
        }

        //pop the result stack
        string result = " ";

        while (exp.Count > 0)
        {
            result += exp.Pop();
            result += "\n=";
        }

        return(result);
    }