我正在使用数组进行二叉搜索树实现。我需要为具有特定高度的BST创建一个数组。我该如何计算这个尺寸?
答案 0 :(得分:1)
我想,你在谈论像二进制堆一样的索引实现。
存储在数组中的所有顶点。这个数组的第一个元素 - 根。如果BST的某个顶点是数组的第i个元素,那么它的左子存储在索引为2 * i的单元格中,右子 - 在索引为2 * i + 1的单元格中。内存中这种表示的方案如下所示:
您询问某个给定高度的树木大小。高度 - 树中的多个级别。换句话说,高度是从根到任何叶子的路径的长度。在上图中,BST的高度为2.
如何计算用于存储固定高度的树的数组大小?它只是几何级数的总和。高度= 0的等级有1个元素,高度= 1的下一个等级有2个元素,下一个等级有4个元素,依此类推。高度= H的级别具有2 ^ H个元素。
用于存储高度= H 的树的数组大小足以存储从0到H的所有级别:
2 ^ 0 //单元格的高度= 0
+
2 ^ 1 //单元格,高度为1
+ ... + + 2 ^ H = 2 ^(H + 1)-1 ;
重要提示 - 许多编程语言都有从零开始的数组索引。因此,当您声明类似int tree[2^(H+1)-1]
的数组时,它表示编号为0到2 ^(H + 1)-2的元素,而您希望它们从1到2 ^(H + 1)-1编号。索引0的元素不方便 - 它打破了“父i,左子2 * i”规则,因为0 = 2 * 0。换句话说,当我说数组中的第一个元素是根时,我的意思是树[1],而不是树[0]。只需忽略树[0]。
最后,BST的 required_array_size,高度为H = calculated_size + zero_ignoring_shift = 2 ^(H + 1)-1 +1 = 2 ^(H + 1) < / p>