【问题标题】:Build Binary Expression Tree构建二元表达式树
【发布时间】:2012-02-03 22:06:42
【问题描述】:

谁能解释一下如何构建二叉表达式树。

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

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

【问题讨论】:

  • 您可以使用调车场算法实现解决方案。以下是维基百科的一些详细信息:en.wikipedia.org/wiki/Shunting-yard_algorithm>。这个算法是由 Edsger Dijkstra 发明的,它是一个很好的选择。如果您需要一些详细信息,我可以发布我前段时间用 C# 编写的代码示例,但我想维基百科链接已经足够了。

标签: algorithm expression-trees


【解决方案1】:

将中缀转换为后缀或前缀

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

  1. 如果不是符号则考虑第一个字符然后创建节点将其添加到堆栈
  2. 如果字符是符号,则使用符号弹出元素创建节点并添加到符号的左侧和右侧
  3. 将符号节点推入堆栈。
  4. 重复 1、2 和 3 直到迭代器没有更多元素

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

【讨论】:

  • 这里符号=操作符
【解决方案2】:

您需要:

  1. 定义描述您的语言的语法
  2. 编写一个词法分析器,从字符串中读取标记
  3. 编写一个从标记构建树的解析器

例如,看看这个方法:http://en.wikipedia.org/wiki/Recursive_descent_parser

还有其他的

【讨论】:

  • 对于一个相当简单的任务来直观地显示表达式是如何解析的,这可能有点过头了。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

    可以分为两步:

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

      例如:'+': 1, 'x': 2, number: inf, '(': base 加 10, ')': base 减 10)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多