Data structures 用数组表示二叉树
考虑以下数组,据称该数组表示二叉树: [1,2,5,6,-1,8,11] 鉴于值为-1的索引表示根元素,我有以下问题: a) 这实际上是如何表现的 我们应该按照下面的公式()来计算树吗? 三个简单的公式允许您从父项索引转到子项索引,反之亦然: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
* 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