有人可以解释如何构建二进制表达式树。
例如,我有一个字符串2*(1+(2*1));
如何将其转换为二进制表达式树。
*
| \
| \
2 +
|\
1 *
|\
2 1
答案 0 :(得分:11)
将中缀转换为后缀或前缀
后缀输入为:a b + c d e + **
Java实施
public Tree.TreeNode createExpressionTree(){
Iterator<Character>itr = postOrder.iterator();
Tree tree = new Tree();
NodeStack nodeStack = new NodeStack();
Tree.TreeNode node;
while (itr.hasNext()) {
Character c = itr.next();
if(!isDigit(c)){
node = tree.createNode(c);
node.right = nodeStack.pop();
node.left = nodeStack.pop();
nodeStack.push(node);
}else{
node = tree.creteNode(c);
nodeStack.push(node);
}
}
node = nodeStack.pop();
return node;
}
答案 1 :(得分:2)
你需要:
例如,看看这种方法:http://en.wikipedia.org/wiki/Recursive_descent_parser
还有其他人
答案 2 :(得分:0)
将表达式转换为前缀或后缀表示法。从那里它应该是非常简单的。以下wiki链接中提到了算法。
答案 3 :(得分:0)
它可以分为两个步骤:
计算每个令牌的优先级值。
例如:&#39; +&#39;:1,&#39; x&#39;:2,数字:inf,&#39;(&#39 ;:将10添加到基数,&# 39;)&#39 ;:从基数减去10)
使用堆栈(约5行代码)基于优先级构建Cartesian tree
您可以在一次扫描中完成。