• PTA 7-2 是否完全二叉搜索树(30 分) 二叉树


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

    输入格式:

    输入第一行给出一个不超过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

    满二叉树:假设这个二叉树有n层,那么每一层的节点数都达到最大的二叉树。
    完全二叉树:把最后一层去掉就是满二叉树,同时最后一层:我们假设最后一层里面如果是满的话是有n个节点,我们从左往右标号1-n,那么最后一层如果想要有节点的话,一定要按照标号顺序建立,不能隔过一个或多个标号去建立其他的节点。

    所以 我们分析一下 完全二叉树的特点:我们按照层次顺序遍历这颗树的过程中,对于任意一节点x
    1 》如果x 有右子树,但是却没有左子树,这肯定不是完全二叉树
    2 》如果x 有左子树,但是却没有右子树,那么剩余的所有节点一定要为叶子节点
    3 》如果 x 左右子树都没有,那么剩余的所有节点也要为叶子节点

    判断是否是完全二叉树很简单  查看是否连续即可  用数组建树方便很多

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define pb push_back
    #define fi first
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    ///////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 1000
    int a[N];
    int n;
    
    void build()
    {
        CLR(a,-1);
        rep(i,1,n)
        {
            int x;
            RI(x);
            int id=1;
            while(1)
            {
                if(a[id]==-1)
                {
                    a[id]=x;break;
                }
                else if(x>a[id])
                {
                    id<<=1;
                }
                else
                id=id*2+1;
            }
        }
    }
    bool check()
    {
        int cnt=0;
        int flag=1;
        rep(i,1,N)
        {
            if(cnt==n)break;
            if(a[i]!=-1)
            {
                cnt++;
                cout<<a[i];
                cout<<(cnt==n?'
    ':' ');
            }
            else//如果中断了说明不是完全二叉树
                flag=0;
        }
        return flag;
    }
    int main()
    {
       RI(n);
       build();
       if(check())
       printf("YES");
       else printf("NO");
        return 0;
    }
    View Code




  • 相关阅读:
    SqlServer2008 安装经验日志总结
    Moile手机开发日志总结若干问题
    安装和卸载Android应用程序(apk包)
    Android Intent 常见用法总结
    vs2008+sqlserver2008 同一台服务器webconfig 数据连接串的配置要点
    注意了android日期控件月份比实际少一个月
    Android 蓝牙开发研究
    [javascript] 怎样在javascript里面调试object
    [Ubuntu] 转载:ubuntu apache2配置
    [Ubuntu] 如何在Ubuntu11.04将PHP5.3降级到PHP5.2
  • 原文地址:https://www.cnblogs.com/bxd123/p/10609402.html
Copyright © 2020-2023  润新知