Rosetta example:https://rosettacode.org/wiki/Tree_traversal
-Implement a binary tree structure, with each node carrying an -integer as a node label, and four traversal strategies: pre-order, -in-order, postorder, and levelorder traversals.
package req nx
The class Tree
implements the basic binary composite structure (left, right).
nx::Class create Tree { - :property -accessor public value:required - :property -accessor public left:object,type=[current] - :property -accessor public right:object,type=[current] - - :public method traverse {order} { - set list {} - :$order v { - lappend list $v - } - return $list - } - - # Traversal methods - :public method preOrder {varName script {level 0}} { - upvar [incr level] $varName var - set var ${:value} - uplevel $level $script - if {[info exists :left]} {${:left} preOrder $varName $script $level} - if {[info exists :right]} {${:right} preOrder $varName $script $level} - } - - :public method inOrder {varName script {level 0}} { - upvar [incr level] $varName var - if {[info exists :left]} {${:left} inOrder $varName $script $level} - set var ${:value} - uplevel $level $script - if {[info exists :right]} {${:right} inOrder $varName $script $level} - } - :public method postOrder {varName script {level 0}} { - upvar [incr level] $varName var - if {[info exists :left]} {${:left} postOrder $varName $script $level} - if {[info exists :right]} {${:right} postOrder $varName $script $level} - set var ${:value} - uplevel $level $script - } - :public method levelOrder {varName script} { - upvar 1 $varName var - set nodes [list [current]] - while {[llength $nodes] > 0} { - set nodes [lassign $nodes n] - set var [$n value get] - uplevel 1 $script - if {[$n eval {info exists :left}]} {lappend nodes [$n left get]} - if {[$n eval {info exists :right}]} {lappend nodes [$n right get]} - } - } -}
This is a factory method to build up the object tree recursively
-from a nested Tcl list. Note that we create left and right childs by
-nesting them in their parent, this provides for a cascading cleanup
-of an entire tree (there is no need for an explicit cascading of
-destroy
methods down the composite).
Tree public object method newFromList {-parent l} { - lassign $l value left right - set n [:new {*}[expr {[info exists parent]?[list -childof $parent]:""}] -value $value] - set props [list] - if {$left ne ""} {lappend props -left [:newFromList -parent $n $left]} - if {$right ne ""} {lappend props -right [:newFromList -parent $n $right]} - $n configure {*}$props - return $n -}
Run the required tests:
set t [Tree newFromList {1 {2 {4 7} 5} {3 {6 8 9}}}] -% $t traverse preOrder -1 2 4 7 5 3 6 8 9 -% $t traverse inOrder -7 4 2 5 1 8 6 9 3 -% $t traverse postOrder -7 4 5 2 8 9 6 3 1 -% $t traverse levelOrder -1 2 3 4 5 6 7 8 9