Conversion is done by methods listed in base/nullable.jl
I would like to know if there is any drawback to an alternative like
abstract Bst
immutable NullNode <: Bst end
type BstNode <: Bst
val::Int
left::Bst
right::Bst
end
isnull(t::Bst) = isa(t,NullNode)
BstNode(key::Int) = BstNode(key, NullNode(), NullNode())
which appears to be good for type-safety, and is (sometimes) slightly
faster and less cumbersome than Nullables.
On Sunday, October 30, 2016 at 6:24:42 PM UTC-4, Ángel de Vicente wrote:
>
> 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/
>