在堆的最右边元素上按级别迭代

时间:2015-12-05 19:30:16

标签: c++

有没有办法可以创建一个for循环,这样,给定任何起始位置,循环将随后遍历每个级别的最右边元素?鉴于一些堆:

enter image description here

如果你在make_heap函数内,你可以从(n-2)/2)开始,这将是由红十二表示的节点。

现在,给定一些起始位置(n-2)/2,是否可以迭代使得循环的后续值为6 -> 2 -> 0(最右边元素的数组位置在初始级别之上,这是红色数字减1),对应14 -> 24 -> 25

我的初始实现看起来像

using std::size_t;

size_t n = last - first; // size of heap
for(size_t start = (n-2)/2; 
    start > 0;
    start = (size_t)pow(2, (size_t)log2(start)-1))
{
    std::cout << start << std::endl;
}

我的想法是,start等于2 log 2 (start)-1 ,这意味着前一个级别。 但是,这仅产生11, 4, 2, 1(为红色的相应节点位置添加一个)。理论上它应该是11, 6, 2, 0。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

假设您的索引是从1开始的,那么直接计算给定其索引n的节点的父节点和子节点:

  • 您使用n / 2
  • 获取父节点
  • 使用n * 2
  • 获取左子节点
  • 您使用n * 2 + 1
  • 获得了严格的子节点

由于C ++中的数组是0-base,因此您可能需要策略性地添加/减去1以在节点和数组索引之间进行转换。

要找到父节点的正确子节点,您将保留当前父节点的索引p,在每个方向上使用p = p / 2替换它,并访问{{1}处的节点}}。当然,如果p * 2 + 1make_heap()类似,则不需要做任何类似的事情。它只需要“冒泡”新节点,而其父节点大于节点。