PAT A1064 Complete Binary Search Tree (***构建完全二叉排序树)

问题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568

题意:

给出N个非负整数,要用它们构建一颗完全二叉排序树。输出这棵完全二叉排序树的层序遍历序列。

 思路:

  1. 如果使用数组来存放完全二叉树,那么对完全二叉树当中的任何一个结点(设编号为x,根节点编号为1),其左孩子结点的编号为2*x,右孩子结点编号为2*x+1。则可以开一个数组CBT[maxn],其中CBT[1]~CBT[N]按层序存放完全二叉树的N个结点,这个数组就存放了,一颗没有对其元素进行赋值的完全二叉树。
  2. 二叉排序树中序遍历序列是递增的,所以将输入的数字从小到大排序,然后对CBT数组表示的二叉树进行中序遍历,并在遍历过程中将数字从小到大填入数组,最后就能得到一颗完全二叉排序树。
  3. CBT数组是按二叉树的层序存放结点的,因此将数组元素按顺序输出即为层序遍历序列。 
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int N;
int in[maxn];
int CBT[maxn];
int num = 0;//记录in[]数组下标 
void inorder(int x){
	if(x < 1 || x > N)
	    return;
	inorder(2 * x);
	CBT[x] = in[num++];
	inorder(2 * x + 1);
}
int main(){
	cin >> N;
	for(int i = 0; i < N; i++)
	    cin >> in[i];
	sort(in, in + N);//将输入从小到大排序后,in[]数组中保存的即为树的中序遍历序列 
	
	inorder(1);//1号位为根节点
	
	for(int i = 1; i <= N; i++)//层序输出完全搜索二叉树 
	{
		cout << CBT[i];
		if(i < N)
		    cout << " ";
	}
	return 0;    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值