Add length and is_empty?

This commit is contained in:
Max Bucknell 2025-03-15 01:54:03 -07:00
parent 6459ec09cf
commit c9f47f2ee7

View file

@ -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