Skip to content

Instantly share code, notes, and snippets.

@audrl1010
Last active June 5, 2018 10:34
Show Gist options
  • Save audrl1010/f6eafca00743db42098e3454594db5a3 to your computer and use it in GitHub Desktop.
Save audrl1010/f6eafca00743db42098e3454594db5a3 to your computer and use it in GitHub Desktop.
Tree
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 = Queue<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 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("blackTea")
  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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment