1064. Complete Binary Search Tree (30)

来源:互联网 发布:太阳和珊瑚的淘宝店 编辑:程序博客网 时间:2024/06/07 21:11

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
根据背模板吧。。建立树
#include <cstdio>#include <vector>#include <algorithm>#include <cmath>#include <queue>using namespace std;#define min(a, b) ((a) < (b) ? (a) : (b))typedef struct tree{struct tree *left;struct tree *right;int num;}tree,*linktree;int in[10000];linktree levelorder(int start, int end, int index) {    if(start > end) return NULL;    int n = end - start + 1;    int l =log(n + 1) / log(2);    int leave = n - (pow(2, l) - 1);    int root = start + pow(2, l - 1) - 1 + min(pow(2, l - 1), leave);    //level[index] = in[root];    linktree t=new tree();    t->num=in[root];    t->left=levelorder(start, root - 1, 2 * index + 1);    t->right=levelorder(root + 1, end, 2 * index + 2);    return t;}void print(linktree head){queue<linktree> que;que.push(head);printf("%d",head->num);int fz=0;while(que.size()){linktree q=que.front();que.pop();if(fz==0) fz=1;else printf(" %d",q->num);if(q->left!=NULL) que.push(q->left);if(q->right!=NULL) que.push(q->right);}}int main() {    int n;    scanf("%d", &n);    for(int i = 0 ; i < n; i++)        scanf("%d", &in[i]);    sort(in, in+n);    linktree head=levelorder(0, n - 1, 0);    print(head);    return 0;}



原创粉丝点击