[Swift] (자료구조) 이진 탐색 트리 / Binary Search Tree
2022. 9. 1. 00:22ㆍ🐣/자료구조
import Foundation struct BinarySearchTree<T: Comparable> { var root: TreeNode<T>? mutating func add(data: T) { let node = TreeNode(data: data) if root == nil { self.root = node return } self.add(newNode: node, under: root) } func search(data: T) -> TreeNode<T>? { return self.search(data: data, in: root) } func delete(data: T) -> T? { return delete(data: data, at: root) } private func delete(data: T, at node: TreeNode<T>?) -> T? { guard let targetNode = self.search(data: data, in: root) else { return nil } // target is leaf node if targetNode.isLeafNode { let parent = self.findParent(of: targetNode, under: root) parent?.rightChild === targetNode ? (parent?.rightChild = nil) : (parent?.leftChild = nil) return targetNode.data } // target has single child node if targetNode.hasSingleChild { let child = targetNode.leftChild != nil ? targetNode.leftChild : targetNode.rightChild guard let parent = self.findParent(of: targetNode, under: root) else { return nil } parent.data > child!.data ? (parent.leftChild = child) : (parent.rightChild = child) return targetNode.data } // target has two child nodes if targetNode.hasTwoChild { let deleted = targetNode.data guard let successor = self.findSuccessor(of: targetNode.rightChild) else { return nil } if !successor.isLeafNode { let parent = self.findParent(of: successor, under: root) parent?.leftChild = successor.rightChild } _ = self.delete(data: successor.data) targetNode.update(data: successor.data) return deleted } return nil } private func findSuccessor(of node: TreeNode<T>?) -> TreeNode<T>? { if node?.leftChild == nil { return node } return self.findSuccessor(of: node?.leftChild) } private func findParent(of node: TreeNode<T>, under parentNode: TreeNode<T>?) -> TreeNode<T>? { if parentNode == nil { return nil } if parentNode?.leftChild === node || parentNode?.rightChild === node { return parentNode } if let parent = findParent(of: node, under: parentNode?.leftChild) { return parent } return findParent(of: node, under: parentNode?.rightChild) } private func search(data: T, in node: TreeNode<T>?) -> TreeNode<T>? { if node == nil || node?.data == data { return node } return node!.data > data ? search(data: data, in: node?.leftChild) : search(data: data, in: node?.rightChild) } @discardableResult private func add(newNode: TreeNode<T>, under parentNode: TreeNode<T>?) -> TreeNode<T>? { guard newNode.data != parentNode?.data else { return nil } if parentNode == nil { return newNode } parentNode!.data > newNode.data ? (parentNode?.leftChild = add(newNode: newNode, under: parentNode?.leftChild)) : (parentNode?.rightChild = add(newNode: newNode, under: parentNode?.rightChild)) return parentNode } func printTree() { print(root!.asString) } }
'🐣 > 자료구조' 카테고리의 다른 글
[Swift] (자료구조) 배열 / Array (0) | 2024.12.27 |
---|---|
[Swift] (자료구조) 해쉬 / Hash (0) | 2024.03.06 |
[Swift] (자료구조) 트리와 이진 트리 / Binary Tree (0) | 2022.09.01 |
[Swift] (자료구조) 우선순위 큐 / Priority Queue (0) | 2022.08.26 |
[Swift] (자료구조) 큐 / Queue (0) | 2022.08.06 |