Add length and is_empty?
This commit is contained in:
parent
6459ec09cf
commit
c9f47f2ee7
1 changed files with 54 additions and 24 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue