I'm new in to elixir and i have question that i'm stack in
a binary tree
Implement a function, sum/1
, that takes a binary tree and returns the sum of all values in the tree. The tree is represented as follows:
@type tree :: {:node, integer(), tree(), tree()} | nil
An example of a depth-wise tree walk in elixir that takes a function to be executed on each node is at https://gist.github.com/kipcole9/43f9551e3c579a7d33e8daed10359c2c
Basically separate the problem into two parts:
Walk the tree recursively
Apply a given function to act on the current node's value, the result of executing the function on the left branch and the result of executing the function on the right branch
defmodule Treewalk do @type tree :: {:node, integer(), tree(), tree()} | nil def depth({:node, value, nil, nil}, _fun) do value end def depth({:node, value, nil, right}, fun) do fun.(value, depth(right, fun), nil) end def depth({:node, value, left, nil}, fun) do fun.(value, depth(left, fun), nil) end def depth({:node, value, left, right}, fun) do fun.(value, depth(left, fun), depth(right, fun)) end # The function to be run on each # node of the tree which is passed # the current value, the result of # running the funciton on the left # branch and the result of running # the function on the right branch def adder(a, b, nil) do a + b end def adder(a, b, c) do a + b + c end # Test tess def tree do {:node, 1, {:node, 2, {:node, 4, nil, nil}, nil }, {:node, 3, nil, {:node, 4, nil, nil} } } end def sum(tree) do depth(tree, &adder/3) end # run a test, returns 14 def test do depth(tree(), &adder/3) end end
Try this.
@type tree :: {:node, integer(), tree(), tree()} | nil
def sum(nil), do: 0
def sum({:node, int, l, r}) do
int + sum(l) + sum(r)
end
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.