带括号前缀表达式构建二叉树时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
相关产品推荐
相关产品推荐

