public class BinaryNode<Element> {
public var value: Element
public var leftChild: BinaryNode?
public var rightChild: BinaryNode?
public init(value: Element) {
self.value = value
}
}
var tree: BinaryNode<Int> = {
let zero = BinaryNode(value: 0)
let one = BinaryNode(value: 1)
let five = BinaryNode(value: 5)
let seven = BinaryNode(value: 7)
let eight = BinaryNode(value: 8)
let nine = BinaryNode(value: 9)
seven.leftChild = one
one.leftChild = zero
one.rightChild = five
seven.rightChild = nine
nine.leftChild = eight
return seven
}()
extension BinaryNode: CustomStringConvertible {
public var description: String {
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 + " ")
}
}
print(tree)
┌──nil
┌──9
| └──8
7
│ ┌──5
└──1
└──0
- 예제 트리를 오름차순으로 방문하는 것을 알 수 있다. 트리가 AVL 트리(자가 균형 이진 탐색 트리)일 경우, 중위 순회는 오름차순으로 노드를 방문한다.
extension BinaryNode {
public func traverseInOrder(visit: (Element) -> Void) {
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
}
tree.traverseInOrder { print($0, terminator: " ")}
0 1 5 7
extension BinaryNode {
public func traversePreOrder(visit: (Element?) -> Void) {
visit(value)
if let leftChild = leftChild {
leftChild.traversePreOrder(visit: visit)
} else {
visit(nil)
}
if let rightChild = rightChild {
rightChild.traversePreOrder(visit: visit)
} else {
visit(nil)
}
}
}
tree.traversePreOrder { print($0, terminator: " ") }
print()
7 1 0 nil nil 5 nil nil 9 8 nil nil nil
extension BinaryNode {
public func traversePostOrder(visit: (Element) -> Void) {
leftChild?.traversePostOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
visit(value)
}
}
tree.traversePostOrder { print($0, terminator: " ")}
print()
0 5 1 8 9 7
func height<T>(of node: BinaryNode<T>? ) -> Int {
guard let node = node else {
return 0
}
return 1 + max(height(of:node.leftChild), height(of:node.rightChild))
}
height(of: tree)
3
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다