Chapter 13: Binary Tree Challenges
func height<T>(of node: BinaryNode<T>?) -> Int {
guard let node = node else {
return -1
}
return 1 + max(height(of: node.leftChild), height(of: node.rightChild))
}extension BinaryNode {
public func traversePreOrder(visit: (Element?) -> Void) {
visit(value)
if let leftChild = leftChild {
leftChild.traversePreOrder(visit: visit)
} else {
// 這些nil node都要記錄下來,這樣才能正確serialization & deserialization.
visit(nil)
}
if let rightChild = rightChild {
rightChild.traversePreOrder(visit: visit)
} else {
visit(nil)
}
}
}
func serialize<T>(_ node: BinaryNode<T>) -> [T?] {
var array: [T?] = []
node.traversePreOrder { array.append($0) }
return array
}
func deserialize<T>(_ array: inout [T?]) -> BinaryNode<T>? {
// 注意: removeFirst是O(n)
// 因為每個element都需要向前位移
guard let value = array.removeFirst() else {
return nil
}
// 遞迴n個node是O(n), 每次遞迴都要removeFirst, 所以總共是O(n^2)
let node = BinaryNode(value: value)
node.leftChild = deserialize(&array)
node.rightChild = deserialize(&array)
return node
}Last updated