Skip to content

Instantly share code, notes, and snippets.

@aydin-emre
Created February 13, 2022 15:32
Show Gist options
  • Save aydin-emre/ea875812cd50e1e500a78acb5b2d76ac to your computer and use it in GitHub Desktop.
Save aydin-emre/ea875812cd50e1e500a78acb5b2d76ac to your computer and use it in GitHub Desktop.
Tree Example on iOS, written in Swift..
import UIKit
public class TreeNode<T> {
public var value: T
public var children: [TreeNode] = []
public init(_ value: T) {
self.value = value
}
public func add(_ child: TreeNode) {
children.append(child)
}
}
extension TreeNode {
public func forEachDepthFirst(visit: (TreeNode) -> Void) {
visit(self)
children.forEach {
$0.forEachDepthFirst(visit: visit)
}
}
}
extension TreeNode {
public func forEachLevelOrder(visit: (TreeNode) -> Void) {
visit(self)
var queue = QueueArray<TreeNode>()
children.forEach { queue.enqueue($0) }
while let node = queue.dequeue() {
visit(node)
node.children.forEach { queue.enqueue($0) }
}
}
}
extension TreeNode where T: Equatable {
public func search(_ value: T) -> TreeNode? {
var result: TreeNode?
forEachLevelOrder { node in
if node.value == value {
result = node
}
}
return result
}
}
//let beverages = TreeNode("Beverages")
//let hot = TreeNode("Hot")
//let cold = TreeNode("Cold")
//
//beverages.add(hot)
//beverages.add(cold)
//beverages.children
//let depthFirstTree = makeBeverageTree()
//depthFirstTree.forEachDepthFirst { print($0.value) }
//
//
//let levelOrderTree = makeBeverageTree()
//levelOrderTree.forEachLevelOrder { print($0.value) }
//
//
//let searchTree = makeBeverageTree()
//if let searchResult1 = searchTree.search("ginger ale") {
// print("Found node: \(searchResult1.value)")
//}
//if let searchResult2 = searchTree.search("WKD Blue") {
// print(searchResult2.value)
//} else {
// print("Couldn't find WKD Blue")
//}
func makeBeverageTree() -> TreeNode<String> {
let tree = TreeNode("Beverages")
let hot = TreeNode("hot")
let cold = TreeNode("cold")
let tea = TreeNode("tea")
let coffee = TreeNode("coffee")
let chocolate = TreeNode("cocoa")
let blackTea = TreeNode("black")
let greenTea = TreeNode("green")
let chaiTea = TreeNode("chai")
let soda = TreeNode("soda")
let milk = TreeNode("milk")
let gingerAle = TreeNode("ginger ale")
let bitterLemon = TreeNode("bitter lemon")
tree.add(hot)
tree.add(cold)
hot.add(tea)
hot.add(coffee)
hot.add(chocolate)
cold.add(soda)
cold.add(milk)
tea.add(blackTea)
tea.add(greenTea)
tea.add(chaiTea)
soda.add(gingerAle)
soda.add(bitterLemon)
return tree
}
public protocol Queue {
associatedtype Element
mutating func enqueue(_ element: Element)
mutating func dequeue() -> Element?
var isEmpty: Bool { get }
var peek: Element? { get }
}
public struct QueueArray<T>: Queue {
private var array: [T] = []
public init() {}
public var isEmpty: Bool {
array.isEmpty
}
public var peek: T? {
array.first
}
public mutating func enqueue(_ element: T) {
array.append(element)
}
public mutating func dequeue() -> T? {
isEmpty ? nil : array.removeFirst()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment