From dcd1a0a877d72a5285b56401866ea9a9a97e8017 Mon Sep 17 00:00:00 2001 From: Bo Qian Date: Sat, 28 Jan 2017 18:11:26 -0800 Subject: [PATCH] Updated README.markdown for the new implementation of insert and remove. Added a remove example in BinarySearchTree.playground. --- .../Images/DeleteTwoChildren.graffle | Bin 2912 -> 11233 bytes .../Images/DeleteTwoChildren.png | Bin 13760 -> 33187 bytes Binary Search Tree/README.markdown | 132 ++++-------------- .../Contents.swift | 3 +- 4 files changed, 31 insertions(+), 104 deletions(-) diff --git a/Binary Search Tree/Images/DeleteTwoChildren.graffle b/Binary Search Tree/Images/DeleteTwoChildren.graffle index a03748077e6c23fec83e473e86fd9d71ef5fe97e..a6a09877a55b170f3d9f0938099d6841e93f1af7 100644 GIT binary patch literal 11233 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 literal 2912 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 diff --git a/Binary Search Tree/Images/DeleteTwoChildren.png b/Binary Search Tree/Images/DeleteTwoChildren.png index c0a77aab1f93d9026e523e2d2439d04ef5b943a5..1d941fe3c16265e73797fa9fc8ea5b621b9d5272 100644 GIT binary patch literal 33187 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 P_@kz*tyHXV*)&wu)y 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 diff --git a/Binary Search Tree/README.markdown b/Binary Search Tree/README.markdown index bacb1ffe1..e8d2f58e2 100644 --- a/Binary Search Tree/README.markdown +++ b/Binary Search Tree/README.markdown @@ -69,21 +69,14 @@ If you traverse a binary search tree in-order, it looks at all the nodes as if t ## Deleting nodes -Removing nodes is kinda tricky. It is easy to remove a leaf node, you just disconnect it from its parent: - -![Deleting a leaf node](Images/DeleteLeaf.png) - -If the node to remove has only one child, we can link that child to the parent node. So we just pull the node out: - -![Deleting a node with one child](Images/DeleteOneChild.png) - -The gnarly part is when the node to remove has two children. To keep the tree properly sorted, we must replace this node by the smallest child that is larger than the node: +Removing nodes is also easy. After removing a node, we replace the node with either its biggest child on the left or its smallest child on the right. That way the tree is still sorted after the removal. In following example, 10 is removed and replaced with either 9 (Figure 2), or 11 (Figure 3). ![Deleting a node with two children](Images/DeleteTwoChildren.png) -This is always the leftmost descendant in the right subtree. It requires an additional search of at most **O(h)** to find this child. +Note the replacement needs to happen when the node has at least one child. If it has no child, you just disconnect it from its parent: + +![Deleting a leaf node](Images/DeleteLeaf.png) -Most of the other code involving binary search trees is fairly straightforward (if you understand recursion) but deleting nodes is a bit of a headscratcher. ## The code (solution 1) @@ -158,23 +151,19 @@ A tree node by itself is pretty useless, so here is how you would add new nodes ```swift public func insert(value: T) { - insert(value, parent: self) - } - - private func insert(value: T, parent: BinarySearchTree) { if value < self.value { if let left = left { - left.insert(value, parent: left) + left.insert(value: value) } else { left = BinarySearchTree(value: value) - left?.parent = parent + left?.parent = self } } else { if let right = right { - right.insert(value, parent: right) + right.insert(value: value) } else { right = BinarySearchTree(value: value) - right?.parent = parent + right?.parent = self } } } @@ -379,7 +368,7 @@ As an exercise for yourself, see if you can implement filter and reduce. ### Deleting nodes -You've seen that deleting nodes can be tricky. We can make the code much more readable by defining some helper functions. +We can make the code much more readable by defining some helper functions. ```swift private func reconnectParentToNode(node: BinarySearchTree?) { @@ -396,7 +385,7 @@ You've seen that deleting nodes can be tricky. We can make the code much more re Making changes to the tree involves changing a bunch of `parent` and `left` and `right` pointers. This function helps with that. It takes the parent of the current node -- that is `self` -- and connects it to another node. Usually that other node will be one of the children of `self`. -We also need a function that returns the leftmost descendent of a node: +We also need a function that returns the minimum and maximum of a node: ```swift public func minimum() -> BinarySearchTree { @@ -406,17 +395,7 @@ We also need a function that returns the leftmost descendent of a node: } return node } -``` - -To see how this works, take the following tree: - -![Example](Images/MinimumMaximum.png) - -For example, if we look at node `10`, its leftmost descendent is `7`. We get there by following all the `left` pointers until there are no more left children to look at. The leftmost descendent of the root node `6` is `1`. Therefore, `1` is the minimum value in the entire tree. - -We won't need it for deleting, but for completeness' sake, here is the opposite of `minimum()`: - -```swift + public func maximum() -> BinarySearchTree { var node = self while case let next? = node.right { @@ -424,94 +403,41 @@ We won't need it for deleting, but for completeness' sake, here is the opposite } return node } -``` -It returns the rightmost descendent of the node. We find it by following `right` pointers until we get to the end. In the above example, the rightmost descendent of node `2` is `5`. The maximum value in the entire tree is `11`, because that is the rightmost descendent of the root node `6`. +``` -Finally, we can write the code that removes a node from the tree: +The rest of the code is pretty self-explanatory: ```swift - public func remove() -> BinarySearchTree? { + @discardableResult public func remove() -> BinarySearchTree? { let replacement: BinarySearchTree? - + + // Replacement for current node can be either biggest one on the left or + // smallest one on the right, whichever is not nil if let left = left { - if let right = right { - replacement = removeNodeWithTwoChildren(left, right) // 1 - } else { - replacement = left // 2 - } - } else if let right = right { // 3 - replacement = right + replacement = left.maximum() + } else if let right = right { + replacement = right.minimum() } else { - replacement = nil // 4 + replacement = nil; } - reconnectParentToNode(replacement) + replacement?.remove(); + // Place the replacement on current node's position + replacement?.right = right; + replacement?.left = left; + reconnectParentTo(node:replacement); + + // The current node is no longer part of the tree, so clean it up. parent = nil left = nil right = nil - - return replacement - } -``` - -It doesn't look so scary after all. ;-) There are four situations to handle: - -1. This node has two children. -2. This node only has a left child. The left child replaces the node. -3. This node only has a right child. The right child replaces the node. -4. This node has no children. We just disconnect it from its parent. - -First, we determine which node will replace the one we're removing and then we call `reconnectParentToNode()` to change the `left`, `right`, and `parent` pointers to make that happen. Since the current node is no longer part of the tree, we clean it up by setting its pointers to `nil`. Finally, we return the node that has replaced the removed one (or `nil` if this was a leaf node). - -The only tricky situation here is `// 1` and that logic has its own helper method: - -```swift - private func removeNodeWithTwoChildren(left: BinarySearchTree, _ right: BinarySearchTree) -> BinarySearchTree { - let successor = right.minimum() - successor.remove() - - successor.left = left - left.parent = successor - - if right !== successor { - successor.right = right - right.parent = successor - } else { - successor.right = nil - } - return successor + return replacement; } ``` -If the node to remove has two children, it must be replaced by the smallest child that is larger than this node's value. That always happens to be the leftmost descendent of the right child, i.e. `right.minimum()`. We take that node out of its original position in the tree and put it into the place of the node we're removing. - -Try it out: - -```swift -if let node2 = tree.search(2) { - print(tree) // before - node2.remove() - print(tree) // after -} -``` - -First you find the node that you want to remove with `search()` and then you call `remove()` on that object. Before the removal, the tree printed like this: - - ((1) <- 2 -> (5)) <- 6 -> ((9) <- 10) - -But after `remove()` you get: - - ((1) <- 5) <- 6 -> ((9) <- 10) - -As you can see, node `5` has taken the place of `2`. - -> **Note:** What would happen if you deleted the root node? In that case, `remove()` tells you which node has become the new root. Try it out: call `tree.remove()` and see what happens. - -Like most binary search tree operations, removing a node runs in **O(h)** time, where **h** is the height of the tree. - ### Depth and height Recall that the height of a node is the distance to its lowest leaf. We can calculate that with the following function: diff --git a/Binary Search Tree/Solution 1/BinarySearchTree.playground/Contents.swift b/Binary Search Tree/Solution 1/BinarySearchTree.playground/Contents.swift index 6d73585b5..ec9902283 100644 --- a/Binary Search Tree/Solution 1/BinarySearchTree.playground/Contents.swift +++ b/Binary Search Tree/Solution 1/BinarySearchTree.playground/Contents.swift @@ -7,8 +7,9 @@ tree.insert(value: 10) tree.insert(value: 9) tree.insert(value: 1) +let toDelete = tree.search(value: 1) +toDelete?.remove() tree -tree.debugDescription let tree2 = BinarySearchTree(array: [7, 2, 5, 10, 9, 1])