diff --git a/lib/mb_binary_tree.ex b/lib/mb_binary_tree.ex index efb41b7..ba375c1 100644 --- a/lib/mb_binary_tree.ex +++ b/lib/mb_binary_tree.ex @@ -1,3 +1,5 @@ +import Kernel, except: [length: 1] + defmodule MbBinaryTree do @moduledoc """ Documentation for `MbBinaryTree`. @@ -40,6 +42,58 @@ defmodule MbBinaryTree do def is_tree?([_, left, right]), do: is_tree?(left) && is_tree?(right) def is_tree?(_), do: false + @spec is_empty?(t) :: boolean + @doc """ + Check if a binary tree is empty. + + ## Examples + + iex> MbBinaryTree.is_empty?(nil) + true + iex> MbBinaryTree.new("hello") |> MbBinaryTree.is_empty?() + false + """ + def is_empty?(nil), do: true + def is_empty?(_), do: false + + @spec length(t) :: non_neg_integer + @doc """ + Get the length of a tree. + + ## Examples + + iex> MbBinaryTree.length([1, MbBinaryTree.new(2), MbBinaryTree.new(3)]) + 3 + iex> MbBinaryTree.length([12, [4, MbBinaryTree.new(2), MbBinaryTree.new(5)], [26, MbBinaryTree.new(14), [28, MbBinaryTree.new(27), MbBinaryTree.new(30)]]]) + 9 + """ + def length([_ | [left, right]]), do: 1 + length(left) + length(right) + def length(_), do: 0 + + @doc """ + Calculate the depth of a binary tree. + + ## Examples + + iex> MbBinaryTree.depth(nil) + 0 + iex> MbBinaryTree.depth([1, nil, nil]) + 1 + iex> MbBinaryTree.depth([1, [2, nil, nil], [3, nil, nil]]) + 2 + iex> MbBinaryTree.depth([1, [2, nil, nil], [3, [4, nil, nil], [5, nil, nil]]]) + 3 + iex> MbBinaryTree.depth([12, [4, MbBinaryTree.new(2), MbBinaryTree.new(5)], [26, MbBinaryTree.new(14), [28, MbBinaryTree.new(27), MbBinaryTree.new(30)]]]) + 4 + """ + def depth(tree) do + case tree do + nil -> 0 + [_, nil, nil] -> 1 + [_, left, right] -> 1 + max(depth(left), depth(right)) + end + end + @spec left(t) :: t @doc """ Get the left child of a tree. @@ -97,28 +151,4 @@ defmodule MbBinaryTree do [12, nil, [4, nil, nil]] """ def update_right([node, left, _right], new_right), do: [node, left, new_right] - - @doc """ - Calculate the depth of a binary tree. - - ## Examples - - iex> MbBinaryTree.depth(nil) - 0 - iex> MbBinaryTree.depth([1, nil, nil]) - 1 - iex> MbBinaryTree.depth([1, [2, nil, nil], [3, nil, nil]]) - 2 - iex> MbBinaryTree.depth([1, [2, nil, nil], [3, [4, nil, nil], [5, nil, nil]]]) - 3 - iex> MbBinaryTree.depth([12, [4, MbBinaryTree.new(2), MbBinaryTree.new(5)], [26, MbBinaryTree.new(14), [28, MbBinaryTree.new(27), MbBinaryTree.new(30)]]]) - 4 - """ - def depth(tree) do - case tree do - nil -> 0 - [_, nil, nil] -> 1 - [_, left, right] -> 1 + max(depth(left), depth(right)) - end - end end