Arrays 将随机二叉树表示为数组?
我正在阅读有关将二叉树存储为数组的知识 我喜欢它的直截了当,但在我的特殊情况下,我需要存储一个随机二叉树,这在结构上是不一致的。类似这样的情况,任何给定深度的节点数量都是不可预测的: 有没有一种简单的方法可以用数组实现类似的功能Arrays 将随机二叉树表示为数组?,arrays,data-structures,tree,binary-tree,Arrays,Data Structures,Tree,Binary Tree,我正在阅读有关将二叉树存储为数组的知识 我喜欢它的直截了当,但在我的特殊情况下,我需要存储一个随机二叉树,这在结构上是不一致的。类似这样的情况,任何给定深度的节点数量都是不可预测的: 有没有一种简单的方法可以用数组实现类似的功能 注意:答案中没有语言偏好。到目前为止,我发现用对象实现这样一个树会更容易、更有效 每个节点都可以基于存储父节点、左节点和右节点的类 Ruby中节点类的示例: 函数在Ruby中生成随机树: 很抱歉我很快回答了自己的问题。我发现在这里详细说明我的问题的过程很有用。也在寻
注意:答案中没有语言偏好。到目前为止,我发现用对象实现这样一个树会更容易、更有效 每个节点都可以基于存储父节点、左节点和右节点的类 Ruby中节点类的示例: 函数在Ruby中生成随机树:
很抱歉我很快回答了自己的问题。我发现在这里详细说明我的问题的过程很有用。也在寻找反馈和其他方法。到目前为止,我发现用对象实现这样的树会更容易、更有效 每个节点都可以基于存储父节点、左节点和右节点的类 Ruby中节点类的示例: 函数在Ruby中生成随机树:
很抱歉我很快回答了自己的问题。我发现在这里详细说明我的问题的过程很有用。也在寻找反馈和其他方法。一个简单的解决方案可以是简单地创建一个数组,就像树是一个完整的二叉树一样,然后用“空”单元格填充缺少的节点 空可以用特殊值表示(取决于域),例如:null、负整数等 如果没有特殊值可用,可以创建另一个大小相同的布尔数组,该数组将保存“单元格是否为空?”的答案 顺便说一句,这样一棵树,其中每个节点最多有2个子节点,被简单地称为二叉树(不需要单词random)。
您称之为二叉树的树(其中每个节点没有子节点或正好有2个子节点)称为完整二叉树。一个简单的解决方案可以简单地创建一个数组,就像树是一个完整的二叉树一样,只需用“空”单元填充缺少的节点 空可以用特殊值表示(取决于域),例如:null、负整数等 如果没有特殊值可用,可以创建另一个大小相同的布尔数组,该数组将保存“单元格是否为空?”的答案 顺便说一句,这样一棵树,其中每个节点最多有2个子节点,被简单地称为二叉树(不需要单词random)。
您称之为二叉树的树(其中每个节点没有子节点或正好有2个子节点)称为完整二叉树。根据您需要对树执行的操作,以下选项可能适用,也可能不适用 可以使用数组表示此树,其中不存储空子树。只有leaf需要存储空的子项。因此,树将表示为如下(空节点用
-1
表示)
33 12-1-12-11-1-1-1-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]
等等
我发现这种结构对于存储树特别有用,其他操作可能很难实现。根据需要在树上执行的操作,以下选项可能对您有效,也可能无效 可以使用数组表示此树,其中不存储空子树。只有leaf需要存储空的子项。因此,树将表示为如下(空节点用
-1
表示)
33 12-1-12-11-1-1-1-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]
等等
我发现这种结构对于存储树特别有用,其他操作可能很难实现。能否请您详细说明为什么在数组中仅使用“空”单元格(树的深度较小)的天真方法是不够的?您是否希望节省空间,即使是以解决方案的复杂性为代价?@OriBar ilan说得通。我从来没有想过这是可能的。回想起来,这似乎是显而易见的。然后我将补充这一点作为正式答案:)你能详细说明一下为什么在数组中只使用“空”单元格(树的深度较小)的天真方法是不够的吗?您是否希望节省空间,即使是以解决方案的复杂性为代价?@OriBar ilan说得通。我从来没有想过这是可能的。回想起来,这似乎是显而易见的。然后,我将补充这一点作为一个正式的回答
class Node
def initialize(parent)
# Instance variables
@parent = parent
@left = nil
@right = nil
end
end
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