zoukankan      html  css  js  c++  java
  • 天梯

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

    输入格式:

    输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

    输出格式:

    将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

    输入样例1:

    9
    38 45 42 24 58 30 67 12 51

    输出样例1:

    38 45 24 58 42 30 12 67 51
    YES

    输入样例2:

    8
    38 24 12 45 58 67 42 51

    输出样例2:

    38 45 24 58 42 12 67 51
    NO

    这题没想到直接用数组模拟数也能过,220,就算不炸内存也会TLE吧,数据太弱了

     1 #include <bits/stdc++.h>
     2 typedef long long LL;
     3 const int INF=0x3f3f3f3f;
     4 const double eps =1e-8;
     5 const int mod=1e9+7;
     6 const int maxn=1e5+10;
     7 using namespace std;
     8 
     9 struct node
    10 {
    11     int x,id;
    12     node *lc, *rc;
    13     node(int a,int b)
    14     {
    15         x=a;
    16         id=b;
    17         lc=rc=NULL;
    18     }
    19 };
    20 int lastid;
    21 
    22 void Insert(node *&T,int x,int id)//id是该节点应该在完全二叉树中的序号 
    23 {
    24     if(T==NULL)
    25     {
    26         node *p=(node*)malloc(sizeof(node));
    27         p->x=x; p->id=id;
    28         p->lc=NULL;
    29         p->rc=NULL;
    30         T=p;
    31         //上面所有的可以直接写成:RT=new node(x,id); 
    32         lastid=max(lastid,id);
    33         return ;
    34     }
    35     if(T->x < x) Insert(T->lc,x,id<<1);
    36     else Insert(T->rc,x,id<<1|1);
    37 }
    38 
    39 int main()
    40 {
    41     #ifdef DEBUG
    42     freopen("sample.txt","r",stdin);
    43     #endif
    44     
    45     int n;
    46     scanf("%d",&n);
    47     node* RT=NULL;
    48     for(int i=1;i<=n;i++)
    49     {
    50         int x;
    51         scanf("%d",&x);
    52         Insert(RT,x,1);
    53     }
    54     
    55     queue<node*> qe;
    56     int one=1;
    57     qe.push(RT);
    58     while(!qe.empty())
    59     {
    60         node* v=qe.front(); qe.pop();
    61         if(one)
    62         {
    63             printf("%d",v->x);
    64             one=0;
    65         }
    66         else printf(" %d",v->x);
    67         if(v->lc) qe.push(v->lc);
    68         if(v->rc) qe.push(v->rc);
    69     }
    70     printf("
    ");
    71     
    72     if(lastid==n) printf("YES
    "); //如果最后一个节点序号是n,必是完全二叉树 
    73     else printf("NO
    ");
    74     
    75     return 0;
    76 }

    下面再给出用别的方法检查是否是完全二叉树时的注意点:

    1:如果当前节点左右孩子均有,就将当前节点弹出,将左右孩子节点加入队列

    2:如果当前节点有左孩子,但是没有右孩子,或者左右孩子均没有,则这个节点以后的节点都应该是叶子节点

    3:如果当前节点没有左孩子,但是有右孩子,则不是完全二叉树

    -

  • 相关阅读:
    c# 坑人的发邮件组件
    生成拼音
    FileDb
    WMI tester
    c# 纯代码调用 webservice
    c# 中 利用 CookieContainer 对 Cookie 进行序列化和反序列化校验
    在经过身份验证的服务中不支持跨域 javascript 回调
    c# 使用 namedpipe 通信
    c++ 创建线程以及参数传递
    c#函数地址传入c++
  • 原文地址:https://www.cnblogs.com/jiamian/p/12578571.html
Copyright © 2011-2022 走看看