简体   繁体   中英

Function that takes a binary tree and returns the sum

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:

  1. Walk the tree recursively

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM