Created
February 13, 2022 15:32
-
-
Save aydin-emre/ea875812cd50e1e500a78acb5b2d76ac to your computer and use it in GitHub Desktop.
Tree Example on iOS, written in Swift..
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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