我的程序目标是展示数学表达式的符号导数。创建一个代表导数的新树后,很可能会留下冗余项。
例如,以下树未简化。 二叉表达式树示例 树
这是我递归函数的一小部分,用于简化树:
例如,以下树未简化。 二叉表达式树示例 树
0 + 5 * (x * 5)
可以重写为 25 * x
我的程序使用许多,许多if
和else
块通过检查常数乘以常数等来减少树。然后,它相应地重新排列子树。这是我递归函数的一小部分,用于简化树:
if(root.getVal().equals("*")) {
if(root.getLeftChild().getVal().equals("1")) {
return root.getRightChild();
}
else if(root.getRightChild().getVal().equals("1")) {
return root.getLeftChild();
}
else if(root.getLeftChild().getVal().equals("0")) {
return root.getLeftChild();
}
else if(root.getRightChild().getVal().equals("0")) {
return root.getRightChild();
}
else if(root.getLeftChild().getVal().equals("*")) {
if(root.getRightChild().getType().equals("constant")) {
if(root.getLeftChild().getLeftChild().getType().equals("constant")) { // Ex: (5*x)*6 ==> 30*x
int num1 = Integer.parseInt(root.getRightChild().getVal());
int num2 = Integer.parseInt(root.getLeftChild().getLeftChild().getVal());
OpNode mult = new OpNode("*");
mult.setLeftChild(new ConstNode(String.valueOf(num1 * num2)));
mult.setRightChild(root.getLeftChild().getRightChild());
return mult;
}
...
...
...
...
这个函数很好用,但需要多次调用才能确保树完全缩小(以防缩小打开了其他缩小可能性)。然而,它有200行代码并且还在不断增长,这让我相信一定有更好的方法来解决这个问题。