Chapter 10: Trees
Last updated
Last updated
// 構成樹的基本資料結構
public class TreeNode<T> {
public var value: T
// 所連結的children
public var children: [TreeNode] = []
public init(_ value: T) {
self.value = value
}
// 建立一個parent和child的連結
public func add(_ child:TreeNode) {
children.append(child)
}
}extension TreeNode {
public func forEachDepthFirst(visit: (TreeNode) -> Void) {
visit(self)
// 針對每個child在進行深度遞迴拜訪
children.forEach {
$0.forEachDepthFirst(visit: visit)
}
}
}extension TreeNode {
public func forEachLevelOrder(visit: (TreeNode) -> Void) {
visit(self)
// 利用queue紀錄當前同個level的所有node
var queue = Queue<TreeNode>()
children.forEach { queue.enqueue($0) }
while let node = queue.dequeue() {
visit(node)
// level遞迴
node.children.forEach { queue.enqueue($0) }
}
}
}extension TreeNode where T: Equatable {
public func search(_ value: T) -> TreeNode? {
var result: TreeNode?
forEachLevelOrder { node in
if node.value == value {
result = node
}
}
return result
}
}