public class ExpressTree
//Tests printTheCode & decodechar in project# 3 format
{  public static void main(String[] as)
   {  Tree t1 = new Tree();
      t1.createTree();
	  t1.printInfix(); 
	  System.out.println();
	  double answer = t1.evalTree();
	  System.out.println("the answer is " + answer);
	  System.out.println();	  
   }
}
   
 class Tree
 { Node root;
   
     private Node subTree(char item)
     {  Node t = new Node();
	    t.left = null;
		t.right = null;
		t.data = item;
		return t;
     }
	 
	 private void leftTree(Node p, char item)
	 {	p.left = subTree(item);
	 }
	 
	 private void rightTree(Node p, char item)
	 { p.right = subTree(item);
	 }

	 public void createTree()
	 { root = subTree('*');
	   leftTree(root, '+'); 
	   rightTree(root , '/');
	   leftTree(root.left, '2'); 
	   rightTree(root.left,'3' );
	   leftTree(root.right, '-');
	   leftTree(root.right.left, '6');
	   rightTree(root.right.left, '4');
	   rightTree(root.right, '4');	     
	 }
	 
	 private boolean leaf(Node t) 	 
	 { return t.left==null && t.right == null;
	 }	 
	 
	 public double evalTree()
	 { return evaluate(root); 
	 }
	 
	 private double evaluate(Node t)
	 {  double eval=0, op1, op2;
	    if( leaf(t) )
	 	  eval = t.data - '0';
		else
		{   op1 = evaluate(t.left);
		    op2 = evaluate(t.right);
			switch ( t.data ) 
			{ case '+': eval = op1 + op2; break;
			  case '-': eval = op1 - op2; break;
			  case '*': eval = op1 * op2; break;
			  case '/': eval = op1 / op2; break;
			}
		}
		return eval;
	 }
	 
	  public void printInfix()
	 { infix(root);
	   
	 }	 
	 
	 private void infix(Node t)
	 { if (t != null)	 	 
	   { infix(t.left);
	     System.out.print( t.data);
		 infix(t.right);
	   }
	 }	 	
   	
	private class Node//defines the treelets comprising the list
   {  char data;
   	  Node left, right;
   }
 }
