zoukankan      html  css  js  c++  java
  • L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

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

    输入格式:

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

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<string>
    #include<set>
    #include<queue>
    #include<deque>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    
    struct node
    {
        int num,left,right;
    }tree[25];
    int a[25];
    int n;
    
    void build()
    {
        int len=1;
        tree[1].num=a[1];
        for(int i=2;i<=n;i++)
        {
    
            int j=1;
            while(1)
            {
                    while(a[i]>tree[j].num)
                    {
                        if(tree[j].left==-1) break;
                        j=tree[j].left;
                    }
                    if (a[i]>tree[j].num && tree[j].left==-1)
                    {
                        tree[++len].num=a[i];
                        tree[j].left=len;
                        break;
                    }
    
    
                    while(a[i]<tree[j].num)
                    {
                        if(tree[j].right==-1) break;
                        j=tree[j].right;
                    }
                    if (a[i]<tree[j].num && tree[j].right==-1)
                    {
                        tree[++len].num=a[i];
                        tree[j].right=len;
                        break;
                    }
    
            }
    
        }
    }
    void work()
    {
        queue<int> Q;
        Q.push(1);
        int flag=0;
        int k=0;
        while(!Q.empty())
        {
            int u=Q.front(); Q.pop();
            printf("%d",tree[u].num);
            k++;
            if (k<n) printf(" "); else printf("
    ");
            if (flag>=0)
            {
                if (tree[u].left>0 && flag>0) flag=-1;
                 else if (tree[u].left<0) flag++;
            }
                if (flag>=0)
                {
                    if (tree[u].right>0 && flag>0) flag=-1;
                       else if (tree[u].right<0) flag++;
                }
    
             if (tree[u].left!=-1) Q.push(tree[u].left);
            if (tree[u].right!=-1) Q.push(tree[u].right);
    
        }
        if (flag==-1) printf("NO
    ");
          else printf("YES
    ");
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            tree[i].num=0;
            tree[i].left=-1;
            tree[i].right=-1;
        }
        build();
        work();
        return 0;
    }
  • 相关阅读:
    压缩感知的由来
    VS2010自动崩溃问题
    随机过程好书推荐
    Kernel PCA
    稀疏性与L1范数
    豆瓣关于计算机视觉的书评及介绍
    压缩感知测量矩阵的研究现状(转)
    信号的功率谱、能量谱、频谱的区别(转)
    vc++ & matlab 换行符号
    arg min 的含义
  • 原文地址:https://www.cnblogs.com/stepping/p/6613197.html
Copyright © 2011-2022 走看看