如何在Julia中实现二进制搜索树?

pav*_*elf 5 julia

我试图在Julia中实现BST,但是当我调用insert函数时遇到了问题.当我尝试创建新节点时,结构保持不变.

我的代码:

type Node
    key::Int64
    left
    right
end

function insert(key::Int64, node)
    if node == 0
        node = Node(key, 0, 0)
    elseif key < node.key
        insert(key, node.left)
    elseif key > node.key
        insert(key, node.right)
    end
end

root = Node(0,0,0)
insert(1,root)
insert(2,root)
Run Code Online (Sandbox Code Playgroud)

我也尝试将零变为零.我试过的下一个版本是在Node中使用已定义的数据类型,但是当我尝试调用没有任何值的insert(类似于C Null)时,它给了我错误.

谢谢你的回答.

Sco*_*nes 16

代码有很多问题.一个是它不是类型稳定的,左和右可以包含任何东西.另一个是在insert函数中设置局部变量节点不会影响任何变化.一个风格问题,修改其参数的函数通常都有!作为名称中的最后一个字符,例如insert!,push!setindex!

我认为以下应该有效:

type BST
    key::Int
    left::Nullable{BST}
    right::Nullable{BST}
end

BST(key::Int) = BST(key, Nullable{BST}(), Nullable{BST}())
BST() = BST(0)

function Base.push!(node::BST, key)
    if key < node.key
        if node.left.isnull
            node.left = BST(key)
        else
            push!(node.left.value, key)
        end
    elseif key > node.key
        if node.right.isnull
            node.right = BST(key)
        else
            push!(node.right.value, key)
        end
    end
end

root = BST()
push!(root, 1)
push!(root, 2)
Run Code Online (Sandbox Code Playgroud)

这个版本超载了朱莉娅推!函数,并使用Nullable类型,以便它可以区分叶节点和它需要继续搜索的位置,以找到插入密钥的位置.这是一个递归定义,并没有进行优化,用循环代替递归会快得多.