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

二叉树中序遍历迭代实现输出异常,请求技术支持

二叉树迭代中序遍历错误排查与修复

问题根源分析

你的迭代遍历方法TreeInStringit存在三个核心逻辑错误,导致无法正确遍历整棵树:

  1. 未更新当前节点索引:每次弹出栈顶元素后,i仍然保留之前的节点索引,导致后续循环重复访问同一个节点(这就是输出ll的直接原因)。
  2. 右子树处理逻辑错误:原代码试图用while循环将右子节点直接入栈,违背了中序遍历「访问当前节点→遍历右子树」的流程,右子树本身需要先遍历其左子节点,不能直接入栈。
  3. 边界检查逻辑混乱: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;
    }
}

修复逻辑说明

这段代码严格遵循中序遍历「左→根→右」的顺序,完美匹配递归方法的逻辑:

  1. 遍历左子树:内层循环持续将当前节点的左子节点入栈,直到没有左子节点为止。
  2. 访问当前节点:弹出栈顶节点(或直接访问当前最左节点),将节点值追加到结果字符串。
  3. 处理右子树:如果当前节点存在右子节点(PR为true),则切换到右子节点索引;否则将current设为-1,后续循环会弹出栈顶的父节点,继续处理父节点的右子树。

测试你的示例(根节点k、左子节点l、右子节点r),这段代码会输出正确的lkr。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:10:43