我需要在Julia中实现一个简单的(但不是二元的)树。基本上,每个节点都需要一个整数ID,我需要一种方便的方法来获取节点的子节点列表+通过ID将子节点添加到现有节点。
e.g。 0→1→(2→(3,4,5),6)
其中每个数字代表一个节点,我需要函数children(2)和add(7作为4的子元素)。
我知道可以为其他语言找到类似的树实现,但我对OOP /类/数据结构很新,而不是设法将它们“翻译”为Julia。
答案 0 :(得分:7)
您没有说明是否希望在添加新节点时自动分配ID,或者如果要在添加子项时指定它们(这将涉及某种形式的更复杂的查找)。 如果可以分配ID,则可以按如下方式实现树结构:
type TreeNode
parent::Int
children::Vector{Int}
end
type Tree
nodes::Vector{TreeNode}
end
Tree() = Tree([TreeNode(0, Vector{Int}())])
function addchild(tree::Tree, id::Int)
1 <= id <= length(tree.nodes) || throw(BoundsError(tree, id))
push!(tree.nodes, TreeNode(id, Vector{}()))
child = length(tree.nodes)
push!(tree.nodes[id].children, child)
child
end
children(tree, id) = tree.nodes[id].children
parent(tree,id) = tree.nodes[id].parent
否则,您可能希望使用Dict{Int,TreeNode}
来存储树节点。