四则运算
public void createBTree(){
6 TreeNode lchild = null, rchild = null, lnode, rnode;
7
8 if(num == 1){
9 lchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
10 rchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
11 root = new TreeNode(String.valueOf(Ran.getOperator()), lchild, rchild);
12 }
13 else{
14 int num1 = 0;
15 int n = getDeep() - 3;
16 boolean[] place = Ran.getChildPlace(num);
17 root = new TreeNode(String.valueOf(Ran.getOperator()), null, null);
18 opeList.add(root);
19
20 for(int i = 0; i < n; i++){
21 for(int j = 0; j < (int)Math.pow(2, i); j++, num1++){
22 lchild = new TreeNode(String.valueOf(Ran.getOperator()), null, null);
23 rchild = new TreeNode(String.valueOf(Ran.getOperator()), null, null);
24 opeList.get(j + num1).setChild(lchild, rchild);
25 opeList.add(lchild);
26 opeList.add(rchild);
27 }
28 }
29
30 for(int i = 0; i < place.length; i++){
31 if(place[i]){
32 lnode = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
33 rnode = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
34 if(i%2 == 0){
35 lchild = new TreeNode(String.valueOf(Ran.getOperator()), lnode, rnode);
36 opeList.add(lchild);
37 opeList.get(num1).setLchild(lchild);
38 }
39 else{
40 rchild = new TreeNode(String.valueOf(Ran.getOperator()), lnode, rnode);
41 opeList.add(rchild);
42 opeList.get(num1).setRchild(rchild);
43 }
44 }
45 else{
46 if(i%2 == 0){
47 lchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
48 opeList.get(num1).setLchild(lchild);
49 }
50 else{
51 rchild = new TreeNode(String.valueOf(Ran.getNumber(Arithmetic.getLine())), null, null);
52 opeList.get(num1).setRchild(rchild);
53 }
54 }
55 num1 = num1 + i%2;
56 }
57 }
58 }
括号添加及去掉:
1 /**
2 * 先对每个运算式添加括号,然后根据去括号法则,去掉多余的子式的括号
3 *
4 * @return string
5 */
6 public String toString(){
7 String Lstr = "", Rstr = "", Str = "";
8 if(hasChild()){
9 if(getRchild().hasChild()){
10 if(str.equals("÷")){
11 Rstr = getRchild().toString();
12 }
13 else if(str.equals("×") || str.equals("-")){
14 if(getRchild().str.equals("+") || getRchild().str.equals("-")){
15 Rstr = getRchild().toString();
16 }
17 else{
18 Rstr = getRchild().toString().substring(1, getRchild().toString().length()-1);
19 }
20 }
21 else{
22 Rstr = getRchild().toString().substring(1, getRchild().toString().length()-1);
23 }
24 }
25 else{
26 Rstr = getRchild().str;
27 }
28 //左子树的情况同右子树类似
29 if(getLchild().hasChild()){
30 if(str.equals("×") || str.equals("÷")){
31 if(getLchild().str.equals("+") || getLchild().str.equals("-")){
32 Lstr = getLchild().toString();
33 }
34 else{
35 Lstr = getLchild().toString().substring(1, getLchild().toString().length()-1);
36 }
37 }
38 else{
39 Lstr = getLchild().toString().substring(1, getLchild().toString().length()-1);
40 }
41 }
42 else{
43 Lstr = getLchild().str;
44 }
45 Str = "(" + Lstr + str + Rstr + ")";
46 }
47 else{
48 Str = str;
49 }
50 return Str;
51 }
结果计算:
1 /**
2 * 获取每个节点的运算结果,并检验除法
3 *
4 * @return result
5 */
6 public String getResult(){
7 if(hasChild()){
8 switch(str){
9 case "+":
10 return String.valueOf(Integer.parseInt(getLchild().getResult()) + Integer.parseInt(getRchild().getResult()));
11 case "-":
12 if(Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()) < 0) {
13 setChild(getRchild(), getLchild()); //如果减法运算结果为负数,则只需要将左右孩子交换一下就行了
14 }
15 return String.valueOf(Integer.parseInt(getLchild().getResult()) - Integer.parseInt(getRchild().getResult()));
16 case "×":
17 return String.valueOf(Integer.parseInt(getLchild().getResult()) * Integer.parseInt(getRchild().getResult()));
18 case "÷":
19 if(getRchild().getResult().equals("0")){ //除数是0的情况
20 while(str.equals("÷")){
21 str = String.valueOf(Ran.getOperator()); //重新生成运算符
22 }
23 return this.getResult();
24 }
25 else if(Integer.parseInt(getLchild().getResult()) % Integer.parseInt(getRchild().getResult()) != 0){
26 while(str.equals("÷")){
27 str = String.valueOf(Ran.getOperator()); //重新生成运算符
28 }
29 return this.getResult();
30 }
31 else
32 return String.valueOf(Integer.parseInt(getLchild().getResult()) / Integer.parseInt(getRchild().getResult()));
33 }
34 }
35 return str;
36 }
