有没有办法可以创建一个for循环,这样,给定任何起始位置,循环将随后遍历每个级别的最右边元素?鉴于一些堆:
如果你在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
。有什么想法吗?
答案 0 :(得分:0)
假设您的索引是从1开始的,那么直接计算给定其索引n
的节点的父节点和子节点:
n / 2
n * 2
n * 2 + 1
由于C ++中的数组是0-base,因此您可能需要策略性地添加/减去1以在节点和数组索引之间进行转换。
要找到父节点的正确子节点,您将保留当前父节点的索引p
,在每个方向上使用p = p / 2
替换它,并访问{{1}处的节点}}。当然,如果p * 2 + 1
与make_heap()
类似,则不需要做任何类似的事情。它只需要“冒泡”新节点,而其父节点大于节点。