Skip to content

Instantly share code, notes, and snippets.

@watsy0007
Last active November 11, 2024 08:47
Show Gist options
  • Save watsy0007/66c166ee2cd65df84c04eb3a8e661add to your computer and use it in GitHub Desktop.
Save watsy0007/66c166ee2cd65df84c04eb3a8e661add to your computer and use it in GitHub Desktop.
elixir binary search tree
defmodule Tree do
@type item :: any()
@type t :: %__MODULE__{l: t() | nil, v: item(), r: t() | nil}
defstruct [l: nil, v: nil, r: nil]
def new(v \\ nil), do: %__MODULE__{v: v}
@spec member(t(), item()) :: bool()
def member(%__MODULE__{v: nil}), do: false
def member(%__MODULE__{v: y}, x) when x == y, do: true
def member(%__MODULE__{l: l, v: y}, x) when x < y, do: member(l, x)
def member(%__MODULE__{v: y, r: r}, x) when x > y, do: member(r, x)
def member(_, _), do: false
@spec insert(t(), item()) :: t()
def insert(%__MODULE__{v: nil}, x), do: new(x)
def insert(%__MODULE__{l: nil, v: y} = set, x) when x < y, do: %{set | l: new(x)}
def insert(%__MODULE__{l: l, v: y} = set, x) when x < y, do: %{set | l: insert(x, l)}
def insert(%__MODULE__{v: y, r: nil} = set, x) when x > y, do: %{set | r: new(x)}
def insert(%__MODULE__{v: y, r: r} = set, x) when x > y, do: %{set | r: insert(r, x)}
def insert(set, _), do: set
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment