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

C#二叉树迭代遍历仅访问左分支无法遍历全树问题排查

问题根因

你的遍历逻辑存在两处低级错误,导致右分支永远不会被访问,还出现了左分支重复遍历的死循环:

  • 压栈逻辑笔误:判断current.right != null的分支下,你错误压入了current.left,整个遍历流程中右节点从来没有被加入过栈,自然不可能访问到右半部分树
  • 重复压入左节点:判断current.left != null的分支下,你再次压入current.left,导致左节点被重复加入栈,弹出后又会重复走左分支逻辑,出现你看到的反复打印8、4、2的异常输出
修复代码

用栈实现二叉树深度优先遍历要记住栈是后进先出结构,要保证左节点先被处理,就得先把右节点压入栈,再压左节点。另外你的方法叫BranchSums,本身是要计算根节点到每个叶子节点的路径和,原来直接返回空列表的逻辑也可以一并补全:

public static List<int> BranchSums(BinaryTree root)
{
    List<int> branchSums = new List<int>();
    // 栈里存节点和当前节点对应的累计路径和
    Stack<(BinaryTree node, int sum)> traverseStack = new Stack<(BinaryTree, int)>();
    traverseStack.Push((root, root.value));

    while (traverseStack.Count > 0)
    {
        var (current, currentSum) = traverseStack.Pop();
        Console.WriteLine(current.value);

        // 碰到叶子节点,把当前路径和存入结果
        if (current.left == null && current.right == null)
        {
            branchSums.Add(currentSum);
            continue;
        }

        // 先压右节点,后压左节点,保证弹出时左节点先被处理
        if (current.right != null)
        {
            traverseStack.Push((current.right, currentSum + current.right.value));
        }
        if (current.left != null)
        {
            traverseStack.Push((current.left, currentSum + current.left.value));
        }
    }
    return branchSums;
}

修复后运行的遍历顺序为1 2 4 8 9 5 10 3 6 7,可以覆盖所有节点,最终返回的分支和结果为[15,16,18,10,11],符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:09:58