/*Binary Search Tree is a node-based binary tree data structure which has the following properties:
The left subtree of a node contains only nodes with keys lesser than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
//Question : What is binary search tree
/*Binary Search Tree is a node-based binary tree data structure which has the following properties:
The left subtree of a node contains only nodes with keys lesser than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
The left and right subtree each must also be a binary search tree.*/
//help link :https://www.journaldev.com/21454/swift-binary-search-tree
class Node<T> {
var data:T
var leftNode:Node? = nil
var rightNode:Node? = nil
init(data:T, leftNode:Node?, rightNode:Node?) {
self.data = data
self.leftNode = leftNode
self.rightNode = rightNode
}
}
class BST<T: Comparable & CustomStringConvertible>{
var rootnode:Node<T>?
func addNode(_ value:T){
let node = Node(data: value, leftNode: nil, rightNode: nil)
if let rootNode = self.rootnode{
self.insert(rootNode, newNode:node)
}else{
self.rootnode = node
}
}
func insert(_ rootNode:Node<T>, newNode:Node<T>){
if(rootNode.data > newNode.data){
if let leftNode = rootNode.leftNode{
self.insert(leftNode, newNode: newNode)
}else{
rootNode.leftNode = newNode
}
}else{
if let rightNode = rootNode.rightNode{
self.insert(rightNode, newNode: newNode)
}else{
rootNode.rightNode = newNode
}
}
}
private func inorder(_ node:Node<T>?){
guard let _ = node else{return}
self.inorder(node?.leftNode)
print("\(node!.data)", terminator: " ")
self.inorder(node?.rightNode)
}
func printTree() {
self.inorder(self.rootnode)
}
}
extension BST{
func search(value:T){
self.search(self.rootnode, value)
}
private func search(_ root:Node<T>?, _ element:T){
guard let rootNode = root else {
print("Node is not available:\(element)")
return
}
print("current root node\(rootNode.data)")
if(element > rootNode.data){
self.search(rootNode.rightNode, element)
}else if(element > rootNode.data){
self.search(rootNode.leftNode, element)
}else{
print("NODE VALUE AVAILABLE :\(rootNode.data)")
}
}
func delete(value:T){
rootnode = self.delete(rootnode, value)
}
func delete(_ root:Node<T>?, _ key:T)-> Node<T>?{
// base case
if(root == nil){
return root
}
// If the key to be deleted is smaller than the root's key,
// then it lies in left subtree
if(key < root!.data){
root?.leftNode = delete(root?.leftNode, key)
// If the key to be deleted is greater than the root's key,
// then it lies in right subtree
}else if(key > root!.data){
root?.rightNode = delete(root?.rightNode, key)
}
// if key is same as root's key, then This is the node
// to be deleted
else{
// node with only one child or no child
if root?.leftNode == nil{
return root?.rightNode
}
else if root?.rightNode == nil{
return root?.leftNode
}
// node with two children: Get the inorder successor (smallest
// in the right subtree)
root?.data = (minValue(root?.rightNode))!
root?.rightNode = delete(root?.rightNode, (root?.data)!)
}
return root
}
public func minValue(_ node: Node<T>?) -> T? {
var tempNode = node
while let next = tempNode?.leftNode {
tempNode = next
}
return tempNode?.data
}
}
let numList:Array<Int> = [8,2,10,9,11,1,7]
var root = BST<Int>()
for number in numList{
root.addNode(number)
}
root.printTree()
//root.search(value: 11)
//root.delete(value: 1)
//root.printTree()