设计思路:
1、定义类node,变量有node类型root ,left,right以及string类型weight
2、初始化函数(以一个新节点为当前节点,根节点为null),设置一个计数器flag=0
2、1初始化weight值,随机数字或符号(若i>=3则必为数将算式限定在10个数以内)
2、11若weight值为符号则i++且调用此初始化函数,(以left为当前节点,本函数中节点为根节点。)
2、12若weight为符号则i++且调用此初始化函数,(以right为当前节点,本函数中节点为根节点。)
3、遍历函数 void inOrderTraverse(Node node)
3、1判断node函数是否为空,为空则return
3、2输出左括号
3、3 inOrderTraverse(node.left);
3、4输出本节点权值
3、5 inOrderTraverse(node.right);
3、6输出右括号
4、求值函数int evaluateExpTree(Node)
4、1 设lvalue和rvalue并初始化为0
4、2 如果节点为操作数,返回该值
4、3如果节点不是运算符
4、31递归计算左子树值为lvalue
4、32递归计算右子树值为rvalue
4、33根据节点计算符计算
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 }
截图如下: