从反向波兰表示法(RPN)转换为树形式?

时间:2013-11-10 21:18:11

标签: java

我不明白该怎么做?有人可以解释如何将ac+ ac+*转换为二叉树形式吗?我需要将此表达式转换为此树的完整带括号的字符串表示形式。

2 个答案:

答案 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();
}