完全二叉树 | Complete Binary Tree | C/C++实现

问题描述

请编写一个程序,读取以完全二叉树形式表示的二叉堆,并按照下述格式输出二叉堆各结点的数据。

node id: key = k, parent key = pk, left key = lk, right key = rk,

其中id为结点编号(下标),k为结点的值,pk为父结点的值,lk为左子结点的值,rk为右子结点的值。当结点不存在时,不进行输出。

输入: 第1行输入堆的大小H。接下来1行,按结点编号顺序输入代表二叉堆结点值(键值)的H个整数,相邻整数用空格隔开。
输出: 依照上述格式按下标从1到H的顺序输出二叉堆各结点的信息。请注意各行最后一个空格。
限制:
H ≤ 250
-2000000000 ≤ 结点的键值 ≤ 2000000000

输入示例

5
7 8 1 2 3

输出示例

node 1: key = 7, left key = 8, right key = 1, 
node 2: key = 8, parent key = 7, left key = 2, right key = 3, 
node 3: key = 1, parent key = 7, 
node 4: key = 2, parent key = 8, 
node 5: key = 3, parent key = 8, 

讲解

二叉堆由完全二叉树实现,因此可以用1起点的一维数组输入键值序列。
我们先对完全二叉树的各结点编号 i i i套用 i / 2 、 2 i 、 2 i + 1 i/2、2i、2i+1 i/22i2i+1三个算式求出其父结点、左右子结点的编号,然后按顺序输出结点信息。请注意,这里要检查上述算式求得的编号是否在1到H之内。

AC代码如下

#include
using namespace std;
#define MAX 100000

int parent(int i) { return i/2; }
int left(int i) { return 2 * i; }
int right(int i) {return 2 * i + 1; }

int main(){
	int H, i, A[MAX + 1];//数组为1起点,所以要+1
	
	cin>>H;
	for(i = 1; i <= H; i++) cin>>A[i];
	
	for(i = 1; i <= H; i++){
		cout<<"node "<<i<<": key = "<<A[i]<<", ";
		if(parent(i) >= 1) cout<<"parent key = "<<A[parent(i)]<<", ";
		if(left(i) <= H) cout<<"left key = "<<A[left(i)]<<", ";
		if(right(i) <= H) cout<<"right key = "<<A[right(i)]<<", ";
		cout<<endl;
	} 
	
	return 0;
}

你可能感兴趣的:(数据结构,完全二叉树,数据结构,算法,Complete,Binary,Tree,C/C++)