zoukankan      html  css  js  c++  java
  • pat1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30)

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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
    

    提交代码

     1 #include<cstdio>
     2 #include<stack>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<stack>
     6 #include<set>
     7 #include<map>
     8 #include<cmath>
     9 using namespace std;
    10 int line[1005],tree[1005];
    11 void Build(int *line,int *tree,int n,int cur){
    12     if(!n){
    13         return;
    14     }
    15     int h=log(n)/log(2);
    16     int x=n-(pow(2,h)-1);
    17 
    18     //cout<<"x: "<<x<<endl;
    19 
    20     if(x>pow(2,h-1)){
    21        x=pow(2,h-1);
    22     }
    23 
    24     //cout<<"x: "<<x<<endl;
    25 
    26     int l=pow(2,h-1)+x-1;
    27 
    28     //cout<<"l:  "<<l<<endl;
    29 
    30     tree[cur]=line[l];
    31     Build(line,tree,l,cur*2+1);
    32     Build(line+l+1,tree,n-l-1,cur*2+2);
    33 }
    34 int main(){
    35     //freopen("D:\INPUT.txt","r",stdin);
    36     int n,i;
    37     scanf("%d",&n);
    38     for(i=0;i<n;i++){
    39         scanf("%d",&line[i]);
    40     }
    41     sort(line,line+n);
    42     Build(line,tree,n,0);
    43     printf("%d",tree[0]);
    44     for(i=1;i<n;i++){
    45         printf(" %d",tree[i]);
    46     }
    47     printf("
    ");
    48     return 0;
    49 }
  • 相关阅读:
    HDOJ1267 下沙的沙子2[DP或卡特兰数]
    HDOJ1711 Number Sequence[KMP模版]
    HDOJ2546 饭卡[DP01背包问题]
    寻找必败态——一类博弈问题的快速解法
    kmp 模版
    网络流题目
    HDOJ1261 字串数[组合+大数]
    传说中效率最高的最大流算法(Dinic) [转]
    ACM博弈论
    HDOJ1061 Rightmost Digit[简单数学题]
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4783480.html
Copyright © 2011-2022 走看看