Last active
April 16, 2017 21:27
-
-
Save sashaafm/e83d31065b98a2dc82ac to your computer and use it in GitHub Desktop.
delete BST
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@doc """ | |
Removes a node with 'node_value' from the given 'tree'. Returns :leaf if the | |
node does not exist. | |
""" | |
@spec delete_node(%{}, any) :: %{} | nil | |
def delete_node(tree, node_value) do | |
if exists?(tree, node_value) do | |
delete tree, node_value | |
else | |
nil | |
end | |
end | |
defp delete(tree, node_value) do | |
cond do | |
tree.value == node_value -> del(tree) | |
tree.value < node_value -> | |
%{left: tree.left, | |
value: tree.value, | |
right: delete(tree.right, node_value)} | |
tree.value > node_value -> | |
%{left: delete(tree.left,node_value), | |
value: tree.value, | |
right: tree.right} | |
end | |
end | |
defp del(%{left: :leaf, value: _, right: right}), do: right | |
defp del(%{left: left, value: _, right: :leaf}), do: left | |
defp del(%{left: left, value: _, right: right}) do | |
%{left: left, value: min(right), right: delete(right, min(right))} | |
end | |
defp min(%{left: :leaf, value: val, right: _}), do: val | |
defp min(%{left: left, value: _, right: _}), do: min left |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment