You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带括号前缀表达式构建二叉树时while(focus!=null)逻辑错误求助

问题核心原因
  • 局部变量赋值不生效:遍历到focus == null后直接给局部变量focus赋值新节点,完全不会修改原树的节点引用,相当于新节点根本没挂到树上
  • 插入位置定位错误:每次处理括号都把focus重置为根节点,没有维护当前节点的层级关系,根本找不到正确的父节点插入
  • 判断逻辑优先级错误:else if的条件里||没有加括号包裹,只要括号栈为空就会触发该分支,和预期逻辑不符
  • 缺少路径维护:仅靠括号栈和节点栈没法记录当前插入的父节点位置,必须新增栈维护遍历路径
修复后的代码
// 新增维护遍历路径的栈,和你的paren、tree栈一起定义即可
Stack<Node> pathStack = new Stack<>();

public void constructTree(String input) {
    // 原有倒序压栈逻辑保留
    for(int i = input.length()-1; i>=0; i--) {
        if(input.charAt(i) == '(' || input.charAt(i) == ')') {
            paren.push(input.charAt(i));
        }
        else {
            tree.push(input.charAt(i));
        }
    }
    // 先清空路径栈
    pathStack.clear();
    root = null;
    while(!paren.isEmpty()) {
        char val = paren.pop();
        if (val == ')' && root == null) {
            throw new InvalidTreeSyntax("Your tree cannot be empty");
        }
        // 处理左括号:新增左节点
        if (val == '(') {
            char nodeVal = tree.pop();
            Node newNode = new Node(nodeVal);
            if (root == null) {
                root = newNode;
                pathStack.push(root);
            } else {
                Node parent = pathStack.peek();
                // 父节点左节点为空就插左边,否则插右边
                if (parent.leftNode == null) {
                    parent.leftNode = newNode;
                } else {
                    parent.rightNode = newNode;
                }
                pathStack.push(newNode);
            }
        } 
        // 处理右括号:当前节点子节点处理完,弹出路径栈
        else if (val == ')') {
            if (!pathStack.isEmpty()) {
                pathStack.pop();
            }
        }
    }
}
核心修改说明
  • 新增pathStack栈维护当前遍历的节点路径,栈顶始终是当前正在处理子节点的父节点
  • 遇到(就弹出节点值创建新节点,挂到当前父节点的左/右空位,再把新节点压入路径栈
  • 遇到)就弹出路径栈的栈顶节点,表示该节点的所有子节点已经处理完成
  • 完全去掉原有遍历左/右节点的无效逻辑,直接通过路径栈定位插入位置,不会出现死循环或者空指针问题

内容的提问来源于stack exchange,提问作者MS_Warrior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:36:10