Chapter 14: Binary Search Trees
Last updated
Last updated
extension BinarySearchTree {
public mutating func insert(_ value: Element) {
// 根據插入值決定新的root位置
root = insert(from: root, value: value)
}
private func insert(from node: BinaryNode<Element>?, value: Element) -> BinaryNode<Element> {
// 如果目前沒有root, 則當前的插入值則為新root
guard let node = node else {
return BinaryNode(value: value)
}
// 利用遞迴方式繼續往下尋找
if value < node.value {
node.leftChild = insert(from: node.leftChild, value: value)
} else {
node.rightChild = insert(from: node.rightChild, value: value)
}
return node
}
} public func contains(_ value: Element) -> Bool {
guard let root = root else {
return false
}
var found = false
// In-order traversal has a time complexity of O(n)
root.traverseInOrder {
if $0 == value {
found = true
}
}
return found
} public func opt_contains(_ value: Element) -> Bool {
var current = root
while let node = current {
if node.value == value {
return true
}
// 利用BST特點來尋找
// This implementation of contains is an O(log n) operation in blanced binary search tree
if value < node.value {
current = node.leftChild
} else {
current = node.rightChild
}
}
return false
}extension BinarySearchTree {
public mutating func remove(_ value: Element) {
root = remove(node: root, value: value)
}
private func remove(node: BinaryNode<Element>?, value: Element) -> BinaryNode<Element>? {
guard let node = node else {
// 連root都沒有,也沒啥好刪
return nil
}
if value == node.value {
// case1: 在leaf
if node.leftChild == nil && node.rightChild == nil {
// 直接刪除root
return nil
}
// case2: 此node只有一個child
if node.leftChild == nil {
return node.rightChild
}
if node.rightChild == nil {
return node.leftChild
}
// case3: 此node有兩個children
node.value = node.rightChild!.min.value
node.rightChild = remove(node: node.rightChild, value: node.value)
} else if value < node.value {
// 遞迴處理
node.leftChild = remove(node: node.leftChild, value: value)
} else {
// 遞迴處理
node.rightChild = remove(node: node.rightChild, value: value)
}
return node
}
}