Chapter 17: AVL Tree Challenges
Challenge 1: How many leaf nodes are there in a perfectly balanced tree of height 3? What about a perfectly balanced tree of height h?”
思路: 完美2元樹其葉子數跟高度的關係
func leafNodes(inTreeOfHeight height: Int) -> Int {
return Int(pow(2.0, Double(height)))
}
Challenge 2: How many nodes are there in a perfectly balanced tree of height 3? What about a perfectly balanced tree of height h?
思路: 找非葉子個數,就每層依序相加
func nodes(inTreeOfHeight height: Int) -> Int {
var totalHeight = 0
for currentHeight in 0...height {
totalHeight += Int(pow(2.0, Double(currentHeight)))
}
return totalHeight
}
Challenge 3 : Since there are many variants of binary trees, it makes sense to group shared functionality in a protocol. The traversal methods are a good candidate for this. Create a TraversableBinaryNode protocol that provides a default implementation of the traversal methods so that conforming types get these methods for free. Have AVLNode conform to this
思路: 這題利用Swift的protocol的概念,把所有不同的tree都擁有的相同traversal function抽離獨立出來。
protocol TraversableBinaryNode {
associatedtype Element
var value: Element { get }
var leftChild: Self? { get }
var rightChild: Self? { get }
func traverseInOrder(visit: (Element) -> Void)
func traversePreOrder(visit: (Element) -> Void)
func traversePostOrder(visit: (Element) -> Void)
}
// 利用protocol extension提供default implementation
extension TraversableBinaryNode {
func traverseInOrder(visit: (Element) -> Void) {
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
func traversePreOrder(visit: (Element) -> Void) {
visit(value)
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePreOrder(visit: visit)
}
func traversePostOrder(visit: (Element) -> Void) {
leftChild?.traversePostOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
visit(value)
}
}
// 讓AVL Tree擁有Traverse的能力
extension AVLNode: TraversableBinaryNode {}
Last updated
Was this helpful?