1064. Complete Binary Search Tree (30)-PAT

来源:互联网 发布:北京网络工程学院 编辑:程序博客网 时间:2024/05/03 16:59

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:
101 2 3 4 5 6 7 8 9 0
Sample Output:
6 3 8 1 5 7 9 0 2 4
推荐指数:※※
来源:http://pat.zju.edu.cn/contests/pat-a-practise/1064
树的性质:高度,每层节点的个数
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<iostream>#include<queue>#include<math.h>using namespace std;int compare(const void *a,const void *b){  return *(int *)a-*(int*)b;}typedef struct Node{  int val;  Node *left;  Node *right;}Node;void build_tree(int *num,int len,Node **r){  if(len>0){    int i,high;    for(i=0;i<1000;i++){      if((int)pow(2.0,i)-1>len){          high=i;          break;      }    }    int ct=(int)pow(2.0,high-1)-1;    int remain=len-ct;    int last_need=(int)pow(2.0,high-1);    int left,right;    if(remain>last_need/2)      left=(ct-1)/2+last_need/2;    else      left=(ct-1)/2+remain;    right=len-left-1;      Node * root= new Node;    *r=root;    root->left=NULL;    root->right=NULL;    root->val=num[left];    if(left>0)      build_tree(num,left,&root->left);    if(right>0)      build_tree(num+left+1,right,&root->right);  }}void print_tree(Node *root){  if(root!=NULL){      queue<Node*> q;      q.push(root);      printf("%d",root->val);      while(!q.empty()){        Node* node=q.front();        if(node!=root)          printf(" %d",node->val);        if(node->left!=NULL)          q.push(node->left);        if(node->right!=NULL)          q.push(node->right);        q.pop();      }  }}int main(){  int n,i;  scanf("%d",&n);  int *num=new int[n];  for(i=0;i<n;i++){    scanf("%d",&num[i]);  }  qsort(num,n,sizeof(int ),compare);  Node *root=NULL;  build_tree(num,n,&root);  print_tree(root);  return 0;}



原创粉丝点击