Data structures 用数组表示二叉树

Data structures 用数组表示二叉树,data-structures,binary-tree,Data Structures,Binary Tree,考虑以下数组,据称该数组表示二叉树: [1,2,5,6,-1,8,11] 鉴于值为-1的索引表示根元素,我有以下问题: a) 这实际上是如何表现的 我们应该按照下面的公式()来计算树吗? 三个简单的公式允许您从父项索引转到子项索引,反之亦然: * if index(parent) = N, index(left child) = 2*N+1 * if index(parent) = N, index(right child) = 2*N+2 * if index(child) = N, inde

考虑以下数组,据称该数组表示二叉树:

[1,2,5,6,-1,8,11]

鉴于值为-1的索引表示根元素,我有以下问题:

a) 这实际上是如何表现的

我们应该按照下面的公式()来计算树吗? 三个简单的公式允许您从父项索引转到子项索引,反之亦然:

* if index(parent) = N, index(left child) = 2*N+1
* if index(parent) = N, index(right child) = 2*N+2
* if index(child) = N, index(parent) = (N-1)/2 (integer division with truncation)
如果我们使用上述公式,那么索引(根)=3,索引(左子项)=7,这是不存在的


b) 知道它是否是一个完整的二叉树很重要吗?

给定一个数组,您可以想出许多方法来表示二叉树。因此没有办法知道,您必须找到该数组的源(不管是什么)

其中一种方法是二进制堆通常按照链接来表示。如果这是使用的表示,-1将不是根元素。位置3处的节点将没有子节点,即,它将是一片叶子

是的,知道它是否应该是一棵完整的树可能很重要


一般来说,你不应该试图弄明白一些数据是什么意思。应该向您提供使用数据的文档或源代码。如果您没有这些,并且确实需要对其进行反向工程,那么您很可能需要更多地了解数据。观察使用它的代码的行为应该对您有所帮助。或者反编译代码。

它可能不是一个完整的二叉树,但也可能不是任意的二叉树。您可以表示一棵树,其中最多有几片最右边的叶子缺失(或者,如果您将约定交换为左边和右边的子项,则最多有几片最左边的叶子缺失)

您不能在数组中表示此值:

    A
   / \
  B   C
 /   / 
D   E
但你可以代表这一点

    A
   / \
  B   C
 / \  
D   E
或者这个:

    A
   / \
  B   C
     / \  
    D   E
(对于最后一个,让2k+1为右子级,2k+2为左子级)


您只需要知道三个节点中的节点数。

N=0必须是根节点,因为根据列出的规则,它没有父节点。如果没有负N,则无法从表达式(2*N+1)或(2*N+2)中创建0

注意,索引不是存储在数组中的值,而是数组中的位置。 对于[1,2,5,6,-1,8,11] 指数0=1 指数1=2 指数2=5等

如果它是一个完整的树,那么-1是一个有效的值,树是

    1  
   /  \  
  2    5  
 / \  / \  
6 -1 8  11  
-1也可以是“NULL”指针,表示该节点上不存在任何值

所以这棵树看起来像

    1  
   / \  
  2   5  
 /   / \  
6   8  11  

我认为还值得注意的是,索引I处节点的父节点可以通过查看索引(I-1)/2来访问。对于偶数
I
,它必须是floor((I-1)/2)a