我正在阅读Eytzinger's method以将二叉树存储为数组。
我喜欢这是多么直接,但在我的具体情况下,我需要存储一个随机二叉树,它在结构上是不一致的。像这样的东西,任何给定深度的节点数量都是不可预测的:
是否有一种简单的方法可以用数组来实现这样的东西?
注意:答案中没有语言偏好。
答案 0 :(得分:1)
一个简单的解决方案可以简单地创建一个数组,就像树是一个完整的二叉树一样,只需用"空的"填充缺失的节点。细胞
空可以用特殊值表示(取决于域),例如:null,负整数等。
如果没有可用的特殊值,您可以创建另一个相同大小的布尔数组,该数组将保持答案为"单元格为空?"。
顺便说一句,这样一棵树,每个节点最多有2个子节点,简称为二叉树(不需要单词 random )。 您称为二叉树的树,其中每个节点都没有子节点或正好有2个子节点,称为完整二叉树。
答案 1 :(得分:1)
取决于您需要在“ tree following”选项上执行的操作,对于您而言可能有效或无效。
您可以用不存储空子树的数组来表示该树。只有叶子需要存储空的子代。因此,树将如下表示(空节点用-1
表示)。
3 3 1 2 2 -1 -1 2 2 2 1 1 1 1 1 -1 -1 -1 -1 -1 -1
让我们将数组表示为A[i]
,其中i >= 0
,然后:
A[0]
-根
A[1]
-根的左子
A[2]
-根的右子
A[3]
-A[1]
的左孩子
A[4]
-A[1]
的右孩子
A[5]
-A[2]
的左孩子(因为没有孩子,而且是叶子-它是空的)
A[6]
-A[2]
的正确子元素(因为没有子元素并且它是一片叶子-它是空的)
A[7]
-A[3]
的左孩子
A[8]
-A[3]
的右孩子
等
我发现此结构对于存储树特别有用,其他操作可能难以实现。
答案 2 :(得分:0)
到目前为止,我发现使用对象实现这样的树会更容易,更有效。
每个节点都可以基于存储parent, left, and right
的类。
Ruby中的节点类示例:
class Node
def initialize(parent)
# Instance variables
@parent = parent
@left = nil
@right = nil
end
end
在Ruby中生成随机树的函数:
def makeTree(root, count)
random = Node.new(root)
treeFull = TRUE
if root.instance_variable_get(:@left) == nil and root.instance_variable_get(:@right) == nil
rand(0..1) == 1 ? root.instance_variable_set(:@left, random) : root.instance_variable_set(:@right, random)
treeFull = FALSE
elsif root.instance_variable_get(:@left) == nil
root.instance_variable_set(:@left, random)
else
root.instance_variable_set(:@right, random)
end
if count>0
if treeFull == FALSE
if rand(0..1) == 1
makeTree(root, count-1)
elsif rand(0..1) == 1
makeTree(root.instance_variable_get(:@left), count-1)
else
makeTree(root.instance_variable_get(:@right), count-1)
end
end
makeTree(random, count-1)
end
end
道歉,快速回答我自己的问题。我发现详细说明问题的过程非常有用。同时寻找反馈和其他方法。