Hi, by searching in the web I found (http://stackoverflow.com/questions/36383517/how-to-implement-bst-in-julia) a way to make my BST code much cleaner (as posted below). Nevertheless, I don't find this very ellegant, since the head node is of type Bst, while the children are of type Nullable{Bst} (is this the 'canonical' way of building recursive data structures with Julia?).
But when I first read the code in SO, I thought that it was probably wrong, since it does: node.left = BST(key) where node.left is of type Nullable{BST}. Then I realized that automatic conversion from BST to Nullable{BST} is done when assigning to node.left, so all is good. Coming from Fortran, this is a bit odd for me... what are the rules for automatic conversion? Thanks a lot, Ángel de Vicente ,---- | module b | | type Bst | val::Int | left::Nullable{Bst} | right::Nullable{Bst} | end | Bst(key::Int) = Bst(key, Nullable{Bst}(), Nullable{Bst}()) | | "Given an array of Ints, it will create a BST tree, type: Bst" | function build_bst(list::Array{Int,1}) | head = list[1] | tree = Bst(head) | for e in list[2:end] | place_bst(tree,e) | end | return tree | end | | function place_bst(tree::Bst,e::Int) | if e == tree.val | println("Dropping $(e). No repeated values allowed") | elseif e < tree.val | if (isnull(tree.left)) | tree.left = Bst(e) | else | place_bst(tree.left.value,e) | end | else | if (isnull(tree.right)) | tree.right = Bst(e) | else | place_bst(tree.right.value,e) | end | end | end | | function print_bst(tree::Bst) | if !isnull(tree.left) print_bst(tree.left.value) end | println(tree.val) | if !isnull(tree.right) print_bst(tree.right.value) end | end | | end `---- ,---- | julia> include("bst.jl") | | julia> b.print_bst( b.build_bst([4,5,10,3,20,-1,10])) | Dropping 10. No repeated values allowed | -1 | 3 | 4 | 5 | 10 | 20 | | julia> `---- -- Ángel de Vicente http://www.iac.es/galeria/angelv/