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’的模糊引用”。
如果你想让它变得漂亮,你可以这样做:
\n\nextension 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\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以将其概括为任何树结构的打印函数,让您选择为每个节点打印什么:
\n\nfunc 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 )} \nRun Code Online (Sandbox Code Playgroud)\n