RosettaCodeData/Task/Same-Fringe/Zkl/same-fringe.zkl
2017-09-25 22:28:19 +02:00

27 lines
1,014 B
Text

var G=Utils.Generator;
//Tree: (node,left,right) or (leaf) or (node,left) ...
aTree := T(1, T(2, T(4, T(7)), T(5)), T(3, T(6, T(8), T(9))));
bTree := aTree;
println("aTree and bTree ",sameFringe(aTree,bTree) and "have" or "don't have",
" the same leaves.");
cTree := T(1, T(2, T(4, T(7)), T(5)), T(3, T(6, T(8))));
dTree := T(1, T(2, T(4, T(7)), T(5)), T(3, T(6, T(8), T(9))));
println("cTree and dTree ",sameFringe(cTree,dTree) and "have"or"don't have",
" the same leaves.");
fcn sameFringe(a,b){ same(G(genLeaves,a),G(genLeaves,b)) }
fcn same(g1,g2){ //(Generator,Generator)
foreach n1,n2 in (g1.zip(g2)){ //-->(int,int) ...
if(n1 != n2) return(); // == return(Void)
}
return(not (g2._next() or g2._next())); //-->False if g1 or g2 has leaves
}
fcn genLeaves(tree){
switch(tree.len()){ // (), (leaf), (node,left, [right])
case(1){ vm.yield(tree[0]) } // leaf: int
case(2){ genLeaves(tree[1]); }
else { genLeaves(tree[1]); genLeaves(tree[2]); }
}
}