Build binary tree from level order array

Have implemented one basic solution.
Please ingore code quality :sweat_smile:, its my 2nd day with elixir.

Approach: Provided unique id to each node, created a map that will map parent_node_id => (left_child_id, right_child_id). Once map is created, Recursively calling on root_id to build the tree.

Code:

defmodule TempTreeNode do
  defstruct [ data: nil, left_id: nil, right_id: nil, id: nil]

  def new(data, unique_id) do
    %__MODULE__{data: data, left_id: nil, left_id: nil, id: unique_id}
  end

  defp input([], _, _, map_node_and_id), do: map_node_and_id
  defp input(input_list, q, unique_id, map_node_and_id) do
    [left_elem, right_elem| input_list] = input_list
    {{:value, current_node}, q} = :queue.out(q)
    new_em = current_node

    left_node = if left_elem != -1  do TempTreeNode.new(left_elem, unique_id + 1) end
    right_node = if right_elem != -1  do TempTreeNode.new(right_elem, unique_id + 2) end

    q = if left_node != nil do :queue.in(left_node, q) else q end
    q = if right_node != nil do :queue.in(right_node, q) else q end

    new_em = if left_node != nil do %{current_node | left_id: left_node.id} else new_em  end
    new_em = if right_node != nil do %{new_em | right_id: right_node.id} else new_em  end

    map_node_and_id = Map.put(map_node_and_id, current_node.id, new_em)
    input(input_list, q, unique_id + 3, map_node_and_id)
  end

  def input_temp_tree(input_list) do
    unique_id = 1
    map_node_and_id = %{}
    [first_element| input_list] = input_list
    q = :queue.new()
    tree_node = TempTreeNode.new(first_element, unique_id)
    q = :queue.in(tree_node, q)
    input(input_list , q, unique_id, map_node_and_id)
  end
end

defmodule TreeNode do
  defstruct [ data: nil, left: nil, right: nil ]

  def new(data \\ 0) do
    %__MODULE__{data: data, left: nil, right: nil}
  end

  def construct_tree(map_node_and_id, unique_id) do
    curr_node = Map.get(map_node_and_id, unique_id)

    if curr_node != nil do
      %TreeNode{
        data: curr_node.data,
        left: construct_tree(map_node_and_id, curr_node.left_id),
        right: construct_tree(map_node_and_id, curr_node.right_id)
      }
    end
  end

  def input_tree(input_list) do
    map_node_and_id = TempTreeNode.input_temp_tree(input_list)
    construct_tree(map_node_and_id, 1)
  end
end

Is there any better approach i can use?