我不明白该怎么做?有人可以解释如何将ac+ ac+*
转换为二叉树形式吗?我需要将此表达式转换为此树的完整带括号的字符串表示形式。
答案 0 :(得分:3)
您需要按照处理后缀输入的方式构建树。但是,当您遇到操作时,不是计算值,而是将堆栈上的参数作为运算符节点的子节点。然后你把它推到堆栈上(就像你在后缀表示法中将计算结果推到堆栈上一样)。
最后,堆栈中唯一的元素应该是完整树的根。
应该大致如下:
public class Node {
char value;
Node left, right;
public Node(char value) {
this.value = value;
}
public static Node parseUpn(String s) {
Stack<Node> stack = new Stack<Node>();
for (char c: s.toCharArray()) {
if (c != ' ') {
Node node = new Node(c);
if ("+-*/".indexOf(c) != -1) {
node.right = stack.pop();
node.left = stack.pop();
}
}
stack.push(node);
}
if (stack.size() != 1) {
throw new RuntimeException("Expected exactly one stack value.");
}
return stack.pop();
}
@Override
public String toString() {
return left == null ? String.valueOf(value) :
("(" + left + " " + value + " " + right + ")");
}
}
答案 1 :(得分:-1)
我将使用类Node
来表示树的节点。我所有的节点需求如下:
public interface Node<T> {
public void addChild(Node<T>);
}
我们假设我有一个具有构造函数TreeNode<T>
的实现类public TreeNode(T value)
。
我将假设您已经切断了字符串并在其他方法中解析了所有字符,因此您有一个代表表达式的Token
数组:
public interface Token {
/**
* @return The number of operands this token takes.
* A return value of 0 indicates this token does not
* take any operands.
*/
public int getOperandCount();
}
(可能需要在您的类中包含其他方法,以便您可以从树中读取值,但构建它并不是绝对必要的。)
此外,
public class MalformedExpressionException extends IllegalArgumentException{
public MalformedExpressionException(String reason){/* [ ... ] */};
// [ ... ]
}
通过以下方法,以下函数将生成一棵树,返回其根节点。
public static Node<Token> makeTree(Token [] tokens){
Stack<Node<Token>> stack = new Stack<>();
try{
for(Token t:tokens){
Node<Token> node = new TreeNode<Token>(t);
for(int idx = 0; idx < t.getOperandCount(); idx++)
node.addChild(stack.pop());
stack.push(node);
}
}catch (EmptyStackException e){
throw new MalformedExpressionException("too few operands");
}
if(stack.size() != 1)
throw new MalformedExpressionException("too many operands");
return stack.pop();
}