Chapter 13: Binary Tree Challenges
Challenge 1 Given a binary tree, find the height of the tree.
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))
}
Challenge 2 Your task is to devise a way to serialize a binary tree into an array, and a way to deserialize the array back into the same binary tree.
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
}
優化版
func deserialize<T>(_ array: inout [T?]) -> BinaryNode<T>? {
- // 注意: removeFirst是O(n)
- // 因為每個element都需要向前位移
- guard let value = array.removeFirst() else {
+ // 注意: removeLast是O(1)
+ guard let value = array.removeLast() else {
return nil
}
- // 遞迴n個node是O(n), 每次遞迴都要removeFirst, 所以總共是O(n^2)
+ // 遞迴n個node是O(n), 每次遞迴都要removeLast, 所以總共是O(n)
let node = BinaryNode(value: value)
node.leftChild = deserialize(&array)
node.rightChild = deserialize(&array)
func deserialize<T>(_ array: [T?]) -> BinaryNode<T>? {
// 優化技巧
var reversed = Array(array.reversed())
return deserialize(&reversed)
}
Last updated
Was this helpful?