Skip to content

Instantly share code, notes, and snippets.

@dmitry-vsl
Last active November 24, 2015 19:02
Show Gist options
  • Save dmitry-vsl/ab40c3b325bcf0a0eb07 to your computer and use it in GitHub Desktop.
Save dmitry-vsl/ab40c3b325bcf0a0eb07 to your computer and use it in GitHub Desktop.
type Tree<T> = {left: Tree<T>, right: Tree<T>, value: T}
function reduceTree<T,A>(tree: Tree<T>, initialAcc: A, reducer: (A,T) => A): A{
if(tree == null){
return initialAcc;
}
var withNodeValue = reducer(initialAcc, tree.value);
var withLeftBranch = reduceTree(tree.left, withNodeValue, reducer);
var withRightBranch = reduceTree(tree.right, withLeftBranch, reducer);
return withRightBranch;
}
type AverageAcc = {sum: number, count: number}
function average(tree: Tree<number>): number{
var acc: AverageAcc = {sum: 0, count: 0};
function reduce(acc: AverageAcc, val: number){
return {sum: acc.sum + val, count: acc.count + 1};
}
var result = reduceTree(tree, acc, reduce);
return result.sum / result.count;
}
var testTree: Tree<number> = {
value: 1,
left: {
value: 2,
left: null,
right: null
},
right: {
value: 4,
left: null,
right: {
value: 5,
left: null,
right: null
}
},
};
console.log(average(testTree));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment