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