首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从前缀表示法构建二进制表达式树?

从前缀表示法构建二进制表达式树?
EN

Stack Overflow用户
提问于 2013-11-27 08:21:04
回答 1查看 5K关注 0票数 1
代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;

public class ExpressionTree {

List<String> expArray = new ArrayList<String>();
ExpressionTreeNode root;
ExpressionTreeNode curNode;
ExpressionTreeNode left;
ExpressionTreeNode right;
String element;

public ExpressionTree(String prefixExpression) {
    String[] temp = prefixExpression.split(" ");
    for (int i = 0; i < temp.length; i++) {
        expArray.add(temp[i]);
    }
    root = createExpressionTree(expArray);
    System.out.println(root);
}

private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) {
    element = prefixExpression.get(0);
    prefixExpression.remove(0);
    if (isNumeric(element)) {
        return new Leaf(Double.parseDouble(element));
    } else {
        left = createExpressionTree(prefixExpression);
        right = createExpressionTree(prefixExpression);
    }
    return new ExpressionTreeNode(left, right, element);
}

private static boolean isNumeric(String str) {
    try {
        double d = Double.parseDouble(str);
    } catch(NumberFormatException nfe) {
        return false;
    }
    return true;
}

}

这是我的代码,当给定*+5 4-3/2 1这样的表达式时,我希望返回一个表达式树。我得到的输出如下所示:

代码语言:javascript
复制
1
|\
2 1
  /\
  2 1
    /\
    2 1

当我想要得到:

代码语言:javascript
复制
     *
     /\
    +  -
   /\   /\
  5  4  3  /
           /\
           2 1

有什么建议吗?为什么我的树中唯一的元素是表达式的最后两个元素?我觉得我漏掉了一些明显的东西。

EN

回答 1

Stack Overflow用户

发布于 2013-11-27 08:47:01

您正在使用字段存储表达式节点程序集的中间结果。在对您正在使用的createExpressionTree(...)的递归调用中,这些代码会被覆盖。

如果将方法修改为使用局部变量作为临时值,那么一切都应该正常工作(也可以从类定义中删除字段)。

代码语言:javascript
复制
private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) {
    String element = prefixExpression.get(0);
    prefixExpression.remove(0);
    if (isNumeric(element)) {
        return new Leaf(Double.parseDouble(element));
    }
    ExpressionTreeNode left = createExpressionTree(prefixExpression);
    ExpressionTreeNode right = createExpressionTree(prefixExpression);
    return new ExpressionTreeNode(left, right, element);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20230687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档