zoukankan      html  css  js  c++  java
  • 【UOJ 572】完全二叉排序树

    【题目描述】:

    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

    (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    (3)左、右子树也分别为二叉排序树;

    (4)没有键值相等的结点。

    完全二叉树:只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

    给出N个数,且这N个数构成1至N的排列。现在需要你按顺序构建一棵二叉排序树,并按照层次遍历的方式输出它,然后判断它是否是一棵完全二叉树。

    【输入描述】:

    输入包含两行。第一行为一个正整数N;第二行为1至N的排列。

    【输出描述】:

    输出包含两行。第一行为构建出的二叉排序树的层次遍历;第二行判断是否是完全二叉树:若是输出yes,否则输出no。

    【样例输入1】:

    10
    7 9 8 4 6 2 10 1 5 3

    【样例输出1】:

    7 4 9 2 6 8 10 1 3 5
    yes

    【样例输入2】:

    5
    3 4 5 2 1

    【样例输出2】:

    3 2 4 1 5
    no

    【样例说明】:

    样例1:/

    样例2:/

    看不见图片请下载

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    对于100%的数据,1≤N≤20

    下载

    题解:我估计是最后一个写出来的吧……不过居然一次性过了,也是不容易。

              用了线段树的思想哈哈。

    #include<bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    int n,a[22],e[10000002],flag,dp,sum;
    
    void dfs(int rt,int x,int num){
        if(e[rt]==0) 
           { e[rt]=x; dp=max(dp,num); return; }
        if(x>e[rt]) dfs(rt*2+1,x,num+1);
        else dfs(rt*2,x,num+1);
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            dfs(1,a[i],1);
        }
        int gs=pow(2,dp)-1;
        for(int i=1;i<=gs;i++){
            if(e[i]==0) flag=1;
            if(e[i]!=0){
               printf("%d ",e[i]);
               sum++;
            }
            if(sum==n) break;
        }  
        if(flag==0) cout<<endl<<"yes";
        if(flag==1) cout<<endl<<"no";
        return 0;
    }
  • 相关阅读:
    网站构建前期知识掌握
    Lucene学习之CURD
    Lucene学习之初步了解
    jQuery的extend详解
    jQuery和DOM对象之间的转换
    Tomcat教程
    Log4j配置
    Java学习之Java中常用对象
    Java学习之Comparable与Comparator的区别
    测试工具。
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11477931.html
Copyright © 2011-2022 走看看