打印带有缩进的树。迅速

Evg*_*eny 4 tree data-structures swift

使用 swift 实现树数据结构:

class Node {

    var value: String
    var children: [Node] = []
    weak var parent: Node?

    init(_ value: String) {
        self.value = value
    }

    func add(_ child: Node){
        children.append(child)
        child.parent = self
    }

    func printTree() {
        var text = self.value
        if !self.children.isEmpty {
            text += "\n  " + self.children.map{$0.printTree()}.joined(separator: ", ")
        }
        print(text)
    }

}
Run Code Online (Sandbox Code Playgroud)

我的目标是看到这样的东西:

A1
    B2
    C3
        G6
    K0
        H7
            L8
        L9
Run Code Online (Sandbox Code Playgroud)

我知道应该有一些聪明的方法来插入缩进,但我也为“地图”而苦苦挣扎。编译器给了我“对成员‘map’的模糊引用”。

Ala*_* T. 5

如果你想让它变得漂亮,你可以这样做:

\n\n
extension Node\n{\n   func treeLines(_ nodeIndent:String="", _ childIndent:String="") -> [String]\n   {\n      return [ nodeIndent + value ]\n           + children.enumerated().map{ ($0 < children.count-1, $1) }\n             .flatMap{ $0 ? $1.treeLines("\xe2\x94\xa3\xe2\x95\xb8","\xe2\x94\x83 ") : $1.treeLines("\xe2\x94\x97\xe2\x95\xb8","  ") }\n             .map{ childIndent + $0 } \n   }\n\n   func printTree()\n   { print(treeLines().joined(separator:"\\n")) }\n}\n\na1.printTree()\n\n// A1\n// \xe2\x94\xa3\xe2\x95\xb8B2\n// \xe2\x94\xa3\xe2\x95\xb8C3\n// \xe2\x94\x83 \xe2\x94\x97\xe2\x95\xb8G6\n// \xe2\x94\x97\xe2\x95\xb8K0\n//   \xe2\x94\xa3\xe2\x95\xb8H7\n//   \xe2\x94\x83 \xe2\x94\x97\xe2\x95\xb8L8\n//   \xe2\x94\x97\xe2\x95\xb8L9\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以将其概括为任何树结构的打印函数,让您选择为每个节点打印什么:

\n\n
func printTree<T>(_ node:T, _ nodeInfo:@escaping (T)->(String,[T]) ) \n{\n  func lines(_ aNode:T, _ nodeIndent:String="", _ childIndent:String="") -> [String]\n  {\n    let (label,children) = nodeInfo(aNode)\n    return [ nodeIndent + label]\n         + children.enumerated().map{ ($0 < children.count-1, $1) }\n           .flatMap{ $0 ? lines($1,"\xe2\x94\xa3\xe2\x95\xb8","\xe2\x94\x83 ") :lines($1,"\xe2\x94\x97\xe2\x95\xb8","  ") }\n           .map{ childIndent + $0 }\n  }\n  print( lines(node).joined(separator:"\\n") )\n}\n\n// print a root node providing a capture to obtain the node\'s label\n// and its array of children\n\nprintTree(a1){ ($0.value,$0.children) }\n\n// works for any tree structure.  for example, views :\n\nprintTree(view){( "\\(type(of:$0)) \\($0.frame)", $0.subviews )} \n
Run Code Online (Sandbox Code Playgroud)\n