查重思路的实现:
1、制定优化二叉树的策略,以达到将表达式规范化的目的,当表达式规范后,重复的表达式将以“同一面目”出现,我们之后就可以直接根据字符串的比较判断两个表达式是否相同。
优化策略如下:
(1)如果右子树的值大于左子树,则左右左子树互换,这样可以保证运算中不会出现负数。
(2)不管左右子树的运算符优先级如何,凡左右子树的根节点为运算符的,在生成表达式时统一在两边加上括号。
如图所示的二叉树,将生成:(1+3)-(1*2)
如:1+2+3,3+(1+2)的两个表达式,规范化后都会变为(1+2)+3,此时我们只需进行字符串比较即可判断题目是否重复
代码说明:
1、
/*
* 按规则优化二叉树,使其计算过程中不出现负数,并且中序遍历,生成查重使用的表达式,进行查重处理
* 按照二叉树求值
*
*/
public BinaryTree adjustmentTree(BinaryTree t) {
if(t!=null) {
String left_value =getTree_value(t.getLeft_tree());
String right_value = getTree_value(t.getRight_tree());
//若右子树的值大于左子树,则交换子树
if(right_value.equals("")||left_value.equals("")) {
return t;
}
else if(dataOper.operData(right_value, left_value,"?").equals("1")) {
t=swapChildTree(t);
}
t.setLeft_tree(adjustmentTree(t.getLeft_tree()));
t.setRight_tree(adjustmentTree(t.getRight_tree()));
}
return t;
}
//中序遍历二叉树,转化为符合预定运算顺序的带括号的表达式
public String treeToExpression(BinaryTree t) {
String left_s="";
String right_s="";
String expression="";
if(t!=null) {
if(t.getLeft_tree()!=null&&t.getRight_tree()!=null) {
String left_root=t.getLeft_tree().getRoot_data();
String right_root=t.getRight_tree().getRoot_data();
if(left_root.equals("+")||left_root.equals("-")||left_root.equals("*")||left_root.equals("÷")) {
left_s="("+treeToExpression(t.getLeft_tree())+")";
}
else {
left_s=treeToExpression(t.getLeft_tree());
}
if(right_root.equals("+")||right_root.equals("-")||right_root.equals("*")||right_root.equals("÷")) {
right_s="("+treeToExpression(t.getRight_tree())+")";
}
else {
right_s=treeToExpression(t.getRight_tree());
}
}
expression=left_s + t.getRoot_data() + right_s;
}
return expression;
}
2、
//由随机生成的基本表达式的后缀表达式按要求构建二叉树
public BinaryTree OptiExpression(String expression) {
Stack stack = new Stack();
Stack tstack = new Stack();
BinaryTree bt = new BinaryTree();
char []express = expression.toCharArray();
String s = "";//暂存入栈信息
for(int i=0;i
if(express[i]!='+'&&express[i]!='-'&&express[i]!='*'&&express[i]!='÷'&&express[i]!='#') {
s+=express[i];
}
else if(express[i]=='#'){
if(!s.equals("")) {
BinaryTree t = new BinaryTree();
t.setRoot_data(s);
t.setLeft_tree(null);
t.setRight_tree(null);
tstack.push(t);
bt=t;
}
s="";
}
else if(express[i]=='+'||express[i]=='-'||express[i]=='*'||express[i]=='÷') {
if(!s.equals("")) {
BinaryTree t = new BinaryTree();
t.setRoot_data(s);
t.setLeft_tree(null);
t.setRight_tree(null);
tstack.push(t);
bt=t;
}
s=""+express[i];
//System.out.println("zan"+tstack.size());
BinaryTree t1 = new BinaryTree();
t1.setRoot_data(s);
t1.setRight_tree(tstack.pop());
t1.setLeft_tree(tstack.pop());
tstack.push(t1);
s="";
bt=t1;
}
}
return bt;
}
五、测试运行