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/