Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- The infixPrint() method takes a BTree that is an expression tree
- and converts it into a String with infix notation that is properly
- parenthesized.
- The expression tree can contain the following five binary operators,
- +, -, *, /, ^
- and two unary operators
- neg, sqrt.
- The unary operators have their operand in their right subtree.
- The unary operator "neg" should be printed out as a minus sign, "-".
- The unary operator "sqrt" should be printed out as "sqrt( )" with
- parentheses around its operand.
- The binary operators should be printed with a space on either side of
- them, except for the "^" operator. Since it has such high precedence,
- it is easier to read if this operator does not have spaces around it.
- You can assume that the expression tree in not empty and that it
- is properly formed (it doesn't have any "syntax errors").
- */
- /*
- * if you happened to read prettyprinter before this, you'll know I added functions to BTree. If you didn't... I added function to BTree :)
- * Hope it's ok, it's was the best way I could figure out some stuff and so I didn't think it would be wrong thing to do.
- * Read my comment on PrettyPrinter for why I needed to add functions.
- * */
- public class InfixPrinter
- {
- /**
- This inlinePrint() method is essentially an
- inorder traversal of the tree.
- */
- public static String infixPrint(BTree tree)
- {
- String result = "";
- if (precedence(tree.getLeftElement()) !=0 && precedence(tree.getRightElement()) == 0 && precedence(tree.getElement()) !=0) // operand, operand, constant
- {
- if (precedence(tree.getLeftElement()) > precedence(tree.getElement())) // left element has higher precedence then parent
- {
- result += "(" + infixPrint(tree.getLeftTree()) + ") " + tree.getElement() + " " + tree.getRightElement();
- }
- else
- {
- result += infixPrint(tree.getLeftTree()) + " " + tree.getElement() + " " + tree.getRightElement();
- }
- }
- else if (precedence(tree.getRightElement()) !=0 && precedence(tree.getLeftElement()) == 0
- && precedence(tree.getElement()) !=0) // constant, operand, operand
- {
- if (precedence(tree.getRightElement()) >= precedence(tree.getElement())) // right element has higher precedence then parent
- {
- result += tree.getLeftElement() + " " + tree.getElement() + " (" + infixPrint(tree.getRightTree()) + ")";
- }
- else
- {
- result += tree.getLeftElement() + " " + tree.getElement() + " " + infixPrint(tree.getRightTree());
- }
- }
- else if (precedence(tree.getLeftElement()) != 0 && precedence(tree.getElement()) !=0 && precedence(tree.getRightElement()) !=0) // operand, operand, operand,
- {
- if (precedence(tree.getLeftElement()) >= precedence (tree.getElement()) && precedence (tree.getElement()) > precedence(tree.getRightElement())) // left higher than or equal to parent, right lower than parent
- {
- result += "(" + infixPrint(tree.getLeftTree()) + ") " + tree.getElement() + " " + infixPrint(tree.getRightTree());
- }
- else if (precedence(tree.getLeftElement()) >= precedence (tree.getElement()) && precedence (tree.getElement()) <= precedence(tree.getRightElement())) // left higher than or equal to parent, right higher than or equal to parent
- {
- result += "(" + infixPrint(tree.getLeftTree()) + ") " + tree.getElement() + " (" + infixPrint(tree.getRightTree()) + ")";
- }
- else if (precedence(tree.getLeftElement()) < precedence (tree.getElement()) && precedence (tree.getElement()) <= precedence(tree.getRightElement())) // left lower than parent, right higher than or equal to parent
- {
- result +=infixPrint(tree.getLeftTree()) + " " + tree.getElement() + " (" + infixPrint(tree.getRightTree()) + ")";
- }
- else if (precedence(tree.getLeftElement()) < precedence (tree.getElement()) && precedence (tree.getElement()) > precedence(tree.getRightElement())) // left lower than parent, right lower than parent
- {
- result +=infixPrint(tree.getLeftTree()) + " " + tree.getElement() + " " + infixPrint(tree.getRightTree());
- }
- }
- else if (precedence(tree.getRightElement()) == 0 && precedence(tree.getLeftElement()) == 0 && tree.getRightTree() != null && tree.getLeftTree() != null ) // constant, anything, constant
- {
- result += tree.getLeftElement() + " " + tree.getElement() + " " + tree.getRightElement();
- }
- else if (precedence(tree.getLeftElement()) == 0 && tree.getRightTree() == null) // constant, anything, null
- {
- result += tree.getLeftElement() + " " + tree.getElement();
- }
- else if (precedence(tree.getRightElement()) == 0 && tree.getLeftTree() == null) // constant, anything, null
- {
- result += tree.getElement() + " " + tree.getRightElement();
- }
- else if (precedence(tree.getElement()) == 0 && precedence(tree.getLeftElement()) != 0 && precedence(tree.getRightElement()) != 0)
- result += " parent node is constant, left child and right child are operators.";
- else if (precedence(tree.getElement()) == 0 && precedence(tree.getLeftElement()) != 0 && precedence(tree.getRightElement()) == 0)
- result += " parent node is a constant, left is an operator, right is a constant.";
- else if (precedence(tree.getElement()) == 0 && precedence(tree.getLeftElement()) == 0 && precedence(tree.getRightElement()) != 0)
- result += " parent node is a constant, left is a constant, right is an operator.";
- return result;
- }//infixPrint()
- // http://www.java-tips.org/java-se-tips/java.lang/what-is-java-operator-precedence.html
- // http://introcs.cs.princeton.edu/java/11precedence/
- public static int precedence(String op)
- {
- int result = 0; // "highest" precedence (i.e., constants)
- if ( op.equals("sqrt") )
- {
- result = 1;
- }
- if ( op.equals("^") )
- {
- result = 2;
- }
- else if ( op.equals("neg") )
- {
- result = 3;
- }
- else if ( op.equals("*")
- || op.equals("/") )
- {
- result = 4;
- }
- else if ( op.equals("+")
- || op.equals("-") )
- {
- result = 5;
- }
- return result;
- }//precedence()
- }//PrettyPrinter
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement