Skip to content

Instantly share code, notes, and snippets.

@sashaafm
Last active April 16, 2017 21:27
Show Gist options
  • Save sashaafm/e83d31065b98a2dc82ac to your computer and use it in GitHub Desktop.
Save sashaafm/e83d31065b98a2dc82ac to your computer and use it in GitHub Desktop.
delete BST
@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