Same fringe: Difference between revisions
Content added Content deleted
(→version 1.1: comgined two subroutines into one, changed/added comments, used cardinal numbers instead of ordinal numbers for internal tree identifiers.) |
(→{{header|Tcl}}: Added zkl) |
||
Line 1,919: | Line 1,919: | ||
c != cc |
c != cc |
||
0 |
0 |
||
</pre> |
|||
=={{header|zkl}}== |
|||
{{trans|Icon and Unicon}} |
|||
<lang zkl>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]); } |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
aTree and bTree have the same leaves. |
|||
cTree and dTree don't have the same leaves. |
|||
</pre> |
</pre> |