Version 0 of Binary trees

Updated 2001-12-20 11:04:57

Richard Suchenwirth - Binary trees are directed graphs in which one node, the root, has no predecessor, and all others have exactly one predecessor and 0, 1 or 2 successors. They can be used for representing (and quickly searching) sorted information.

Here are some routines that create a binary tree from a list, convert it back to a list, and search it (though I'm afraid lsearch will be faster and simpler in most cases...) You might find the extended use of expr as control structure interesting.

 proc btree L {
    if {[llength $L]>1} {
        set L [lsort $L]
        set center [expr [llength $L]/2]
        list [lindex $L $center] \
            [btree [lrange $L 0  [expr {$center-1}]]]\
            [btree [lrange $L [expr {$center+1}] end]]
    } else {set L}
 }
 proc bt2list bt {
    expr {
        [llength $bt]?
            [concat [bt2list [lindex $bt 1]]\
                    [list    [lindex $bt 0]]\
                    [bt2list [lindex $bt 2]]\
            ]
        : [list]
    }
 }
 proc btsearch {bt x} {
    set root [lindex $bt 0]
    expr {
        [llength $bt]?
            $root > $x? [btsearch [lindex $bt 1] $x]
            : $root < $x? [btsearch [lindex $bt 2] $x]
            : 1
         : 0
    }
 }
 if 0 {
    Test and usage examples:
    % btree {5 4 3 2 1 6 7}
    4 {2 1 3} {6 5 7}
    %  btree {foo bar grill this and that or not}
    not {foo {bar and {}} grill} {that or this}
    % bt2list [btree {foo bar grill this and that or not}]
    and bar foo grill not or that this
    % btsearch [btree {foo bar grill this and that or not}]   grill
    1
    % btsearch [btree {foo bar grill this and that or not}]   grille
    0
 }

Arts and crafts of Tcl-Tk programming