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]); } } }