设计思路:

1、定义类node,变量有node类型root leftright以及string类型weight

 

2、初始化函数(以一个新节点为当前节点,根节点为null),设置一个计数器flag=0

   21初始化weight值,随机数字或符号(若i>=3则必为数将算式限定在10个数以内)

       211weight值为符号则i++且调用此初始化函数,(以left为当前节点,本函数中节点为根节点。)

       212weight为符号则i++且调用此初始化函数,(以right为当前节点,本函数中节点为根节点。)

  

 

3、遍历函数 void inOrderTraverse(Node node)

   31判断node函数是否为空,为空则return

   32输出左括号

   3inOrderTraverse(node.left); 

   34输出本节点权值

   3inOrderTraverse(node.right); 

   36输出右括号 

 

4、求值函数int evaluateExpTree(Node)

   4lvaluervalue并初始化为0

   4如果节点为操作数,返回该值

   43如果节点不是运算符

       431递归计算左子树值为lvalue 

       432递归计算右子树值为rvalue 

       433根据节点计算符计算

5、判断答案是否正确

 

代码如下:

  1 package 四则运算3;
  2 
  3 import java.util.Scanner;
  4 
  5 //节点类
  6      class Node
  7     {
  8         public Node root;
  9         public Node left;
 10         public Node right;
 11         public String weight;
 12         
 13         public void setroot(Node r)
 14         {
 15             root=r;
 16         }
 17         
 18         public void setleft(Node l)
 19         {
 20             left=l;
 21         }
 22         public void setright(Node r)
 23         {
 24             right=r;
 25         }
 26         public void setweight(String w)
 27         {
 28             weight=w;
 29         }
 30         public String getweight()
 31         {
 32             return weight;
 33         }
 34     }
 35     
 36     
 37 public  class Test {
 38      
 39     //控制式子长度
 40     static int flag=0;
 41     static    String shizi="";
 42     
 43     //初始化树函数(当前节点,当前节点父节点)
 44     static void setTree(Node now,Node root)
 45     {
 46         
 47         now.left=new Node();
 48         now.right=new Node();
 49         now.setroot(root);
 50         //用于判定是符号-1还是数字-0
 51         int panding=(int)(Math.random()*2);
 52         //System.out.println(panding);
 53         
 54         if(panding==1)
 55         {
 56             //生成符号
 57             //System.out.println("生成符号");
 58             int fuhao=(int)(Math.random()*4);
 59             if(fuhao==0) now.setweight("+");
 60             if(fuhao==1) now.setweight("-");
 61             if(fuhao==2) now.setweight("*");
 62             if(fuhao==3) now.setweight("*");
 63             //System.out.println(now.getweight());
 64             setTree(now.left,now);
 65             setTree(now.right,now);
 66             }
 67         if(panding==0)
 68         {
 69             //System.out.println("生成数字");
 70             now.setweight(""+(int)(Math.random()*100));
 71             flag++;
 72             //System.out.println(now.getweight());
 73         }
 74         
 75     }
 76     //遍历函数(生成算式)
 77     static     void inOrderTraverse(Node now){
 78         
 79         if(now.weight==null) return;
 80         else{
 81             shizi=shizi+"(";
 82             inOrderTraverse(now.left);
 83             shizi=shizi+now.getweight();
 84             inOrderTraverse(now.right);
 85             shizi=shizi+")";
 86             
 87         }
 88         
 89     }
 90      //求值函数
 91     static    int evaluateExpTree(Node now){
 92         int lvalue=0,rvalue=0;
 93         int zhi=0;
 94         //如果本节点是符号则递归否则返回本值
 95         if(now.left.getweight()!=null){
 96             //System.out.println("是符号"+now.getweight());
 97             lvalue=evaluateExpTree(now.left);
 98             rvalue=evaluateExpTree(now.right);
 99         }
100         else 
101         {    
102             //System.out.println("是数字"+now.getweight());
103             zhi=Integer.parseInt(now.getweight());
104         }
105         //System.out.println("左值为"+lvalue);
106         //System.out.println("右值为"+rvalue);
107         if(now.weight.charAt(0)=='+') zhi=lvalue+rvalue;
108         if(now.weight.charAt(0)=='-') zhi=lvalue-rvalue;
109         if(now.weight.charAt(0)=='*') zhi=lvalue*rvalue;
110         if(now.weight.charAt(0)=='/') zhi=lvalue/rvalue;
111         //System.out.println("值为"+zhi);
112         return zhi;
113     }
114     
115     
116     public static  void main(String args[])
117     {
118         
119         for(int i=0;i<10;i++){
120             Node initial = new Node();
121             initial.setweight("+");
122             Node ltree=new Node();
123             Node rtree=new Node();
124             initial.setleft(ltree);
125             initial.setright(rtree);
126             //判断数字位数,超过则重新出题
127             while(flag==0||flag>4)
128             {
129                 flag=0;setTree(ltree,initial);
130             }
131             flag=0;
132             while(flag==0||flag>4)
133             {
134                 flag=0;setTree(rtree,initial);
135             }
136             
137             
138             inOrderTraverse(initial);
139             shizi=shizi+"=";
140             System.out.println(shizi);
141             System.out.println("请输入答案");
142             Scanner sca=new Scanner(System.in);
143             int answer=sca.nextInt();
144             if(answer==evaluateExpTree(initial)) 
145                 System.out.println("回答正确");
146             else 
147                 System.out.println("回答错误,正确答案是"+evaluateExpTree(initial));
148             
149             shizi="";
150             flag=0;
151         }
152             
153                 
154     }
155 
156 }

 

 

截图如下: