图的开始--第六天打卡之二叉堆
作者:
lgd123
,
2021-07-30 12:46:53
,
所有人可见
,
阅读 229
/*二叉堆
1、一棵完全二叉树的节点的键值与数组的各元素具备,以节点编号(从上到下,从左到右)为数组下标,以节点 键值为数组值,满足这样的关系,这样的二叉树被称为二叉堆
2、二叉堆虽然看起来是属于完全二叉树的,但实际上是以起点为1,用数组储存起来的。
3、在知道一个节点的编号x时,可以通过floor(x/2),2*x,2*x+1,来分别求出父节点,左子节点,右子节点。
4、二叉堆分有最大堆和最小堆,分别满足节点键值小于等于其父节点的键值,节点键值大于等于父节点的键值。
5、无论是最大堆还是最小堆都是值各个节点与根节点的关系,兄弟节点之间没有这种大小关系。
*/
#include<iostream>
using namespace std;
const int N = 300;
long long a[N];
int parent(int u ) {return u/2;}
int left(int u ) {return 2*u;}
int right(int u) {return 2*u+1;}
int main()
{
int n ;
cin>>n;
for(int i = 1; i <= n ; i ++) cin>>a[i];
for(int i = 1 ;i <= n ;i ++)
{
cout<<"node "<<i<<": key = "<<a[i]<<", ";
if(parent(i)>=1) cout<<"parent key = "<<a[parent(i)]<<", ";
if(left(i)<=n) cout<<"left key = "<<a[left(i)]<<", ";
if(right(i)<=n) cout<<"right key = "<<a[right(i)]<<", ";
cout<<endl;
}
return 0;
}