27 lines
1,014 B
Text
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]); }
|
|
}
|
|
}
|