class BinaryNode<Element>{
var value: Element
var leftNode: BinaryNode?
var rightNode: BinaryNode?
init(_ value: Element) {
self.value = value
}
//left is minimum, if not available then self is minimum
var min:BinaryNode? {
return leftNode?.min ?? self
}
public func minimum() -> BinaryNode {
var node = self
while let next = node.leftNode {
node = next
}
return node
}
public func maximum() -> BinaryNode {
var node = self
while let next = node.rightNode {
node = next
}
return node
}
}
// This is for display purposes ONLY!!!
extension BinaryNode: CustomStringConvertible {
public var description: String {
var s = ""
if let left = leftNode {
s += "(\(left.description)) <- "
}
s += "\(value)"
if let right = rightNode {
s += " -> (\(right.description))"
}
return s
}
}
extension BinarySearchTree:CustomStringConvertible {
var description: String {
guard let root = root else {
return "Empty Tree"
}
return String(describing:root)
}
}
struct BinarySearchTree<Element:Comparable> {
private(set) var root:BinaryNode<Element>?
init() { }
mutating func insert(_ value: Element) -> BinarySearchTree{
let newNode = BinaryNode(value)
if root == nil {
root = newNode
return self
} else {
guard let root = root else {
return self
}
var currentNode = root
while true {
if value < currentNode.value {
//check left node
if currentNode.leftNode == nil {
currentNode.leftNode = newNode
return self
} else {
currentNode = currentNode.leftNode! //force-casting is fine in this case because we already done nil check
}
} else {
if value == currentNode.value {
fatalError("duplicates are not allowed in BST")
}
//check right node
if currentNode.rightNode == nil {
currentNode.rightNode = newNode
return self
} else {
currentNode = currentNode.rightNode!
}
}
}
}
return self
}
///Check if value is available in a BST
func lookup(_ value: Element) -> Bool {
return false
}
///Remove a value from BST
func remove(_ value:Element) -> Bool {
return false
}
}
var bst = BinarySearchTree<Int>()
bst.insert(9)
bst.insert(4)
bst.insert(6)
bst.insert(20)
bst.insert(170)
bst.insert(15)
bst.insert(1)
print(bst)