构建二进制表达式树

时间:2012-02-03 22:06:43

标签: algorithm expression-trees

有人可以解释如何构建二进制表达式树。

例如,我有一个字符串2*(1+(2*1));如何将其转换为二进制表达式树。

 *
 | \
 |  \
 2  +
    |\
    1 *
      |\
      2 1

4 个答案:

答案 0 :(得分:11)

将中缀转换为后缀或前缀

后缀输入为:a b + c d e + **

  1. 考虑第一个字符,如果它不是符号,则创建节点将其添加到堆栈
  2. 如果字符是符号,则使用符号pop元素创建节点,并添加到符号
  3. 的左侧和右侧
  4. 将符号节点推入堆栈。
  5. 重复1,2和3,直到迭代器没有更多元素
  6. 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;
    }
    

    更多信息:http://en.wikipedia.org/wiki/Binary_expression_tree

答案 1 :(得分:2)

你需要:

  1. 定义描述您的语言的语法
  2. 编写一个词法分析器,用于读取字符串中的标记
  3. 编写一个从标记构建树的解析器
  4. 例如,看看这种方法:http://en.wikipedia.org/wiki/Recursive_descent_parser

    还有其他人

答案 2 :(得分:0)

将表达式转换为前缀或后缀表示法。从那里它应该是非常简单的。以下wiki链接中提到了算法。

http://en.wikipedia.org/wiki/Polish_notation

http://en.wikipedia.org/wiki/Reverse_Polish_notation

答案 3 :(得分:0)

它可以分为两个步骤:

  1. 计算每个令牌的优先级值。

    例如:&#39; +&#39;:1,&#39; x&#39;:2,数字:inf,&#39;(&#39 ;:将10添加到基数,&# 39;)&#39 ;:从基数减去10)

  2. 使用堆栈(约5行代码)基于优先级构建Cartesian tree

  3. 您可以在一次扫描中完成。