zoukankan      html  css  js  c++  java
  • 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

    题目分析:

    本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的时候只要按编号从大到小就可以输出层序遍历了,此外,对于是否完全二叉树的判断也可以通过直接判断数组对应的值是否为0即可,需要注意的是由于可能出现极端的情况,这里20个数字可能会占用2^20-1的空间,所以数组需要开大一些

    由数组建树代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 using namespace std;
     5 
     6 int k[2500000];
     7 
     8 void createTree(int gen, int x){
     9     if(k[gen] == 0){
    10         k[gen] = x;
    11         return;
    12     }else{
    13         if(x > k[gen]) createTree(gen*2, x);
    14         else createTree(gen*2+1, x);
    15         return;
    16     }
    17 }
    18 
    19 int main(){
    20     int n;
    21     scanf("%d", &n);
    22     memset(k, 0, sizeof(k));
    23     for(int i = 1; i <= n; i++){
    24         int x;
    25         scanf("%d", &x);
    26         createTree(1, x);
    27     }
    28     int flag = 1;
    29     int cnt = 0;
    30     int num = 1;
    31     for(int i = 1; i <= n; i++) num *= 2;
    32     for(int i = 1; i <= num; i++){
    33         if(k[i] != 0){
    34             cnt++;
    35             if(cnt > 1) printf(" ");
    36             printf("%d", k[i]);
    37         }else{
    38             if(cnt < n) flag = 0; 
    39         }
    40     }
    41     printf("
    "); 
    42     if(flag == 1) printf("YES
    ");
    43     else printf("NO
    ");
    44     return 0;
    45 }

     由链式建树代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<queue>
     5 using namespace std;
     6 
     7 int cnt, n;
     8 
     9 struct Node{
    10     int data;
    11     Node* left;
    12     Node* right;
    13 }*root;
    14 
    15 Node* createTree(Node* root, int x){
    16     if(root == NULL){
    17         root = new Node();
    18         root->data = x;
    19         root->left = NULL;
    20         root->right = NULL;
    21         return root;
    22     }
    23     if(x > root->data) root->left = createTree(root->left, x);
    24     else root->right = createTree(root->right, x);
    25     return root;
    26 }
    27 
    28 void run(Node* root){
    29     queue<Node*> q;
    30     cnt = 1;
    31     q.push(root);
    32     int flag = 1;
    33     while(!q.empty()){        //有节点就有数字需要输出 
    34         Node* t = q.front();
    35         q.pop();
    36         if(cnt > 1) printf(" ");
    37         printf("%d", t->data);
    38         if(t->left){
    39             q.push(t->left);
    40             cnt++;
    41         } 
    42         else{
    43             if(cnt < n) flag = 0;
    44         }
    45         if(t->right){
    46             q.push(t->right);    
    47             cnt++;
    48         } 
    49         else{
    50             if(cnt < n) flag = 0;
    51         }
    52     }
    53     printf("
    ");
    54     if(flag == 1) printf("YES
    ");
    55     else printf("NO
    ");
    56 }
    57 
    58 int main(){
    59     scanf("%d", &n);
    60     for(int i = 1; i <= n; i++){
    61         int x;
    62         scanf("%d", &x);
    63         root = createTree(root, x);
    64     }    
    65     run(root);
    66     return 0;
    67 }
  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/findview/p/12264470.html
Copyright © 2011-2022 走看看