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
|
defmodule MbBinaryTree do
|
||||||
@moduledoc """
|
@moduledoc """
|
||||||
Documentation for `MbBinaryTree`.
|
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?([_, left, right]), do: is_tree?(left) && is_tree?(right)
|
||||||
def is_tree?(_), do: false
|
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
|
@spec left(t) :: t
|
||||||
@doc """
|
@doc """
|
||||||
Get the left child of a tree.
|
Get the left child of a tree.
|
||||||
|
@ -97,28 +151,4 @@ defmodule MbBinaryTree do
|
||||||
[12, nil, [4, nil, nil]]
|
[12, nil, [4, nil, nil]]
|
||||||
"""
|
"""
|
||||||
def update_right([node, left, _right], new_right), do: [node, left, new_right]
|
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
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue