二叉树中序遍历迭代实现输出异常,请求技术支持
二叉树迭代中序遍历错误排查与修复
问题根源分析
你的迭代遍历方法TreeInStringit存在三个核心逻辑错误,导致无法正确遍历整棵树:
- 未更新当前节点索引:每次弹出栈顶元素后,
i仍然保留之前的节点索引,导致后续循环重复访问同一个节点(这就是输出ll的直接原因)。 - 右子树处理逻辑错误:原代码试图用
while循环将右子节点直接入栈,违背了中序遍历「访问当前节点→遍历右子树」的流程,右子树本身需要先遍历其左子节点,不能直接入栈。 - 边界检查逻辑混乱:
i < T.Length的检查位置不合理,容易导致数组越界或无效节点访问。
修复后的迭代方法代码
结合你的二叉树存储结构(左子节点用L指向索引,右子节点为当前索引+1,PR标记是否存在右子节点),修正后的迭代中序遍历代码如下:
public void TreeInStringit(int i, ref string s)//iterative output { Stack<int> stack = new Stack<int>(); int current = i; while (current != -1 && current < T.Length || stack.Count > 0) { // 遍历到当前节点的最左子节点,路径上的节点入栈 while (current != -1 && current < T.Length && T[current].L != -1) { stack.Push(current); current = T[current].L; } // 处理无效节点,弹出栈顶的父节点 if (current == -1 || current >= T.Length) { if (stack.Count == 0) break; current = stack.Pop(); } // 访问当前节点 s += T[current].inf; // 切换到右子节点(如果存在),否则设为-1 current = T[current].PR ? current + 1 : -1; } }
修复逻辑说明
这段代码严格遵循中序遍历「左→根→右」的顺序,完美匹配递归方法的逻辑:
- 遍历左子树:内层循环持续将当前节点的左子节点入栈,直到没有左子节点为止。
- 访问当前节点:弹出栈顶节点(或直接访问当前最左节点),将节点值追加到结果字符串。
- 处理右子树:如果当前节点存在右子节点(
PR为true),则切换到右子节点索引;否则将current设为-1,后续循环会弹出栈顶的父节点,继续处理父节点的右子树。
测试你的示例(根节点k、左子节点l、右子节点r),这段代码会输出正确的lkr。
内容的提问来源于stack exchange,提问作者KJJK
相关产品推荐
相关产品推荐

