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
相关产品推荐
相关产品推荐

