C#中无法遍历全部树节点求助:实现Node.Next()扩展方法
看了你的代码,问题出在Next()方法的逻辑完全没处理从叶子节点回溯到父节点找下一个兄弟的场景,而且内部的循环和递归调用完全是多余的,导致遍历到节点3之后就找不到后续节点了。
修正后的
Next()扩展方法 public static Node Next(this Node node) { // 第一步:如果当前节点有子节点,返回第一个子节点(前序遍历优先走子节点) if (node.Children.Any()) { return node.Children.First(); } // 第二步:没有子节点,向上找父节点,寻找有未遍历兄弟的祖先 Node current = node; while (current.Parent != null) { var siblings = current.Parent.Children.ToList(); int index = siblings.IndexOf(current); // 如果有下一个兄弟节点,直接返回 if (index < siblings.Count - 1) { return siblings[index + 1]; } // 没有的话,继续向上回溯到父节点 current = current.Parent; } // 第三步:回溯到根节点仍无后续节点,返回null return null; }
逻辑拆解
- 优先访问子节点:前序遍历的核心规则是先父后子,所以当前节点有子节点时,直接返回第一个子节点即可,这对应测试用例中
1→2、2→3的步骤。 - 回溯找兄弟节点:当当前节点是叶子节点(比如3),我们需要向上遍历父节点,检查当前节点是否有未被访问的兄弟节点——比如3的父节点2还有子节点4,所以
3→4;当4遍历完后,向上回溯到2,发现2的子节点已全部遍历,继续回溯到根节点1,找到它的下一个子节点5,完成4→5的跳转。 - 终止条件:当回溯到根节点且没有更多兄弟节点时,返回null,结束遍历。
替换这个方法后,你的测试用例会输出期望的1、2、3、4、5、6、7,所有断言也会全部通过。
内容的提问来源于stack exchange,提问作者awais




