Skip to content

Instantly share code, notes, and snippets.

@hoshi-takanori
Last active March 24, 2019 21:04
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hoshi-takanori/809e9475effaad6c12e6 to your computer and use it in GitHub Desktop.
Save hoshi-takanori/809e9475effaad6c12e6 to your computer and use it in GitHub Desktop.
Binary Tree in Swift 2.0.
//: Binary Tree
protocol CollectionTypeConvertible {
typealias T
var array: [T] { get }
}
class Node<T: Comparable> {
let value: T
var left: Node?
var right: Node?
convenience init(value: T) {
self.init(value: value, left: nil, right: nil)
}
init(value: T, left: Node?, right: Node?) {
self.value = value
self.left = left
self.right = right
}
func add(value: T) {
if value < self.value {
Node.addNode(&left, value: value)
} else {
Node.addNode(&right, value: value)
}
}
static func addNode(inout node: Node?, value: T) {
if node != nil {
node!.add(value)
} else {
node = Node(value: value)
}
}
}
extension Node: CustomStringConvertible {
var description: String {
if left != nil && right != nil {
return "\(value) => [left: \(left!), right: \(right!)]"
} else if left != nil && right == nil {
return "\(value) => [left: \(left!), right:]"
} else if left == nil && right != nil {
return "\(value) => [left:, right: \(right!)]"
} else {
return "\(value)"
}
}
func draw() {
left?.draw("", " ", " | ")
print("\(value)")
right?.draw("", " | ", " ")
}
func draw(indent: String, _ leftIndent: String, _ rightIndent: String) {
left?.draw(leftIndent, leftIndent + " ", leftIndent + " | ")
print(indent + " +- " + "\(value)")
right?.draw(rightIndent, rightIndent + " | ", rightIndent + " ")
}
}
extension Node: CollectionTypeConvertible {
var array: [T] {
return (left?.array ?? []) + [value] + (right?.array ?? [])
}
}
print("# Int")
let tree = Node(value: 5)
tree.add(1)
tree.add(2)
tree.add(20)
tree.add(17)
print(tree)
tree.draw()
print("# String")
let strTree = Node(value: "hello")
strTree.add("yellow")
strTree.add("allow")
strTree.add("Allow")
strTree.add("Below")
print(strTree)
strTree.draw()
print("# Convert to Array")
let array = tree.array
print(array)
print(array.sort(>))
let strArray = strTree.array
print(strArray)
print(strArray.sort(>))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment