Have implemented one basic solution.
Please ingore code quality
, 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?






















