Chapter 12: Binary Trees
前言
二元樹是一個相當重要的樹結構,後面會提到的binary search tree和AVL tree都是根據二元樹再插入跟刪除方面做一個加強的限制。
大綱
Implementation
Building a diagram
Traversal algorithms
In-order traversal
Pre-order traversal
Post-order traversal
Implementation
二元樹,就是每個node最多只有兩個children。
public class BinaryNode<Element> {
public var value: Element
public var leftChild: BinaryNode?
public var rightChild: BinaryNode?
public init(value: Element) {
self.value = value
}
}
Building a diagram
只是把樹狀結構畫出來,我是覺得不重要。但還是把code寫出來
extension BinaryNode: CustomStringConvertible {
public var description: String {
return diagram(for: self)
}
private func diagram(for node: BinaryNode?,
_ top: String = "",
_ root: String = "",
_ bottom: String = "") -> String {
guard let node = node else {
return root + "nil\n"
}
if node.leftChild == nil && node.rightChild == nil {
return root + "\(node.value)\n"
}
return diagram(for: node.rightChild,
top + " ", top + "┌──", top + "│ ")
+ root + "\(node.value)\n"
+ diagram(for: node.leftChild,
bottom + "│ ", bottom + "└──", bottom + " ")
}
}
Traversal algorithms
前一章介紹的兩種Traversal當然也可以用在二元樹,但在二元樹又有其他比較特殊的Traversal。
In-order traversal(左根右)

public func traverseInOrder(visit: (Element) -> Void) {
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
Pre-order traversal(根左右)

public func traversePreOrder(visit: (Element) -> Void) {
visit(value)
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePreOrder(visit: visit)
}
Post-order traversal(左右根)

public func traversePostOrder(visit: (Element) -> Void) {
leftChild?.traversePostOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
visit(value)
}
Last updated
Was this helpful?