将随机二叉树表示为数组?

时间:2017-07-20 00:08:53

标签: arrays data-structures tree binary-tree

我正在阅读Eytzinger's method以将二叉树存储为数组。

enter image description here

我喜欢这是多么直接,但在我的具体情况下,我需要存储一个随机二叉树,它在结构上是不一致的。像这样的东西,任何给定深度的节点数量都是不可预测的:

enter image description here

是否有一种简单的方法可以用数组来实现这样的东西?

注意:答案中没有语言偏好。

3 个答案:

答案 0 :(得分:1)

一个简单的解决方案可以简单地创建一个数组,就像树是一个完整的二叉树一样,只需用"空的"填充缺失的节点。细胞

空可以用特殊值表示(取决于域),例如:null,负整数等。

如果没有可用的特殊值,您可以创建另一个相同大小的布尔数组,该数组将保持答案为"单元格为空?"。

顺便说一句,这样一棵树,每个节点最多有2个子节点,简称为二叉树(不需要单词 random )。 您称为二叉树的树,其中每个节点都没有子节点或正好有2个子节点,称为完整二叉树

答案 1 :(得分:1)

取决于您需要在“ tree following”选项上执行的操作,对于您而言可能有效或无效。

enter image description here

您可以用不存储空子树的数组来表示该树。只有叶子需要存储空的子代。因此,树将如下表示(空节点用-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

道歉,快速回答我自己的问题。我发现详细说明问题的过程非常有用。同时寻找反馈和其他方法。