Swift:如何不使用join或高阶函数按层级打印树形结构?
不依赖join或高阶函数的Swift树形结构层级打印实现
嘿,我来帮你搞定这个不使用join方法或高阶函数的树形结构打印需求!我们可以通过递归+手动字符串拼接+层级缩进跟踪来实现,完全贴合你的要求。
首先,先修正原TreeNode类里的小冗余(移除了add方法里不必要的print(children)),然后给出完整的扩展实现:
完整代码实现
class TreeNode<T>{ weak var parent: TreeNode? var children: [TreeNode] = [] var value: T init(value: T){ self.value = value } func add(_ child: TreeNode){ self.children.append(child) child.parent = self } } extension TreeNode{ // 对外的无参入口方法,默认从根层级(0级)开始打印 func printTree() -> String { return printTree(withLevel: 0) } // 内部递归方法,跟踪当前节点的层级,用于生成缩进 private func printTree(withLevel level: Int) -> String { // 生成当前层级的缩进:这里用2个空格代表一层,也可以换成树形符号优化视觉效果 let indent = String(repeating: " ", count: level) var nodeString = "\(indent)\(value)\n" // 用普通for-in循环遍历子节点,手动拼接每个子节点的打印结果 // 完全没有使用join或高阶函数(map/flatMap等) for child in children { nodeString += child.printTree(withLevel: level + 1) } return nodeString } }
代码说明
- 递归层级跟踪:我们新增了私有递归方法
printTree(withLevel:),通过level参数记录当前节点的层级,以此生成对应的缩进,保证树形结构的层级感。 - 手动字符串拼接:遍历子节点时使用普通的
for-in循环,逐个将子节点的打印结果拼接到总字符串中,完全避开了join方法和高阶函数。 - 可定制的缩进样式:如果你想要更直观的树形视觉效果,可以修改缩进的生成逻辑,比如:
private func printTree(withLevel level: Int) -> String { var indent = "" if level > 0 { // 用竖线和横线组合出树形分支 indent = String(repeating: "| ", count: level - 1) + "└──" } var nodeString = "\(indent)\(value)\n" for child in children { nodeString += child.printTree(withLevel: level + 1) } return nodeString }
使用示例
// 构建测试树形结构 let root = TreeNode(value: "Root") let child1 = TreeNode(value: "Child1") let child2 = TreeNode(value: "Child2") let grandchild1 = TreeNode(value: "Grandchild1") let grandchild2 = TreeNode(value: "Grandchild2") root.add(child1) root.add(child2) child1.add(grandchild1) child1.add(grandchild2) // 打印树形结构 print(root.printTree())
普通缩进版本输出:
Root Child1 Grandchild1 Grandchild2 Child2
树形符号版本输出:
Root └── Child1 └── Grandchild1 └── Grandchild2 └── Child2
内容的提问来源于stack exchange,提问作者mfaani
相关产品推荐
相关产品推荐

