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

C++ 在堆的最右边元素上按级别迭代,c++,C++,有没有一种方法可以创建一个for循环,这样,给定任何起始位置,该循环随后将遍历每个级别最右边的元素?给定一些堆: 如果您在make_heap函数中,可以从(n-2)/2)开始,该节点由红色12表示 现在,给定一些起始位置(n-2)/2,是否可以进行迭代,使循环的后续值为6->2->0(初始级别上方最右边元素的数组位置,即红色数字减1),对应于14->24->25 我最初的实现看起来像 使用std::size\u t; 大小\u t n=最后一个-第一个;//堆的大小 对于(尺寸开始=(n-2

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

如果您在
make_heap
函数中,可以从
(n-2)/2)
开始,该节点由红色12表示

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


我最初的实现看起来像

使用std::size\u t;
大小\u t n=最后一个-第一个;//堆的大小
对于(尺寸开始=(n-2)/2;
开始>0;
开始=(大小t)功率(2,(大小t)log2(开始)-1))
{

std::cout假设您的索引是基于1的,那么直接计算给定索引的节点的父节点和子节点
n

  • 您可以使用
    n/2
  • 使用
    n*2
  • 使用
    n*2+1
<>因为C++中的数组是0-基,所以可能需要策略性地添加/Studio 1来转换节点和数组索引。
要获得父节点的正确子节点,您需要保留当前父节点的索引
p
,在每个方向使用
p=p/2
替换它,并在
p*2+1
访问节点。当然,如果
make_heap()
类似于
std::make_heap()
它不需要做那样的事情。它只需要“冒出泡沫”新节点的父节点比节点大。

问题是我不需要父节点的正确子节点,我需要父节点级别的最右边的子节点。但是我已经解决了这个问题,并将简短地给出答案。您似乎在考虑基于1和基于0的索引时遇到了问题。在基于1的索引中,级别是
v=floor(log2(n))
所以在基于零的索引中,级别是
v=floor(log2(n+1))
。然后在基于1的索引中,下一个较低级别的最右边元素是
n=pow(2,v)-1
所以在基于零的索引中,级别是
n=pow(2,v)-2
因此,将上述两个方程结合起来进行基于零的索引将是
n=pow(2,floor(log2(n+1))-2;
您可以根据自己的喜好将“floor”隐藏在转换为整数类型的内部。