PAT A 1064 Complete Binary Search Tree(30分)


A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node’s key. The right subtree of a node contains only nodes with keys greater than or equal to the node’s key. Both the left and right subtrees must also be binary search trees. A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right. Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input:
10 1 2 3 4 5 6 7 8 9 0
Sample Output:
6 3 8 1 5 7 9 0 2 4
タイトル:
ノード数n、完全二叉ルックアップツリーの各ノードの重み値を入力します.完全二叉ルックアップツリーの階層シーケンスを出力する.
考え方:
(1)オープン配列num[]は入力シーケンスを格納し、それを非減算ソートし、オープン配列CBT[]は完全二叉ルックアップツリーを格納する.(2)完全二叉木の性質により、木の結点id(層順遍歴順)は[1,n]、結点iの左子結点は2 i、右子結点は2 i+1、CBT[i]は結点idがiの結点を表し、対応する要素値は結点権値である.(3)シーケンス遍歴シーケンスが非減算である二叉ルックアップツリーの性質による、完全二叉ルックアップツリーCBT[]を中シーケンス遍歴し、i回目にアクセスするノードCBT[i d]の重み値をnum[i]とし、最終的にCBT[]が格納シーケンスが層シーケンスシーケンスシーケンスシーケンスシーケンスである.
コード:
#include 
#include 
using namespace std;
const int maxn = 1010;

int n,num[maxn],k = 0,CBT[maxn];//   n、    num[]、num[]  k、   CBT[] 
void inorder(int root){//     
	if(root>n) return;
	inorder(root*2);
	CBT[root] = num[k++];// num[i]            
	inorder(root*2+1);
}

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&num[i]);
	}	
	sort(num,num+n);
	inorder(1);//   id 1 
	for(int i=1;i<=n;i++){
		printf("%d",CBT[i]);
		if(i!=n) printf(" ");
	}
	return 0;
}