zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) 1110. Complete Binary Tree (25)

    判断一棵二叉树是否完全二叉树。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<map>
    #include<queue>
    #include<stack>
    #include<algorithm>
    using namespace std;
    
    int n,root;
    const int maxn=30;
    struct Node
    {
        int left;
        int right;
        int dep;
    } s[maxn];
    int flag[maxn];
    vector<int>g[maxn];
    int Max_dep=0;
    
    void dfs(int x,int dep)
    {
        Max_dep=max(dep,Max_dep);
        s[x].dep=dep;
        g[dep].push_back(x);
    
        if(s[x].left!=-1) dfs(s[x].left,dep+1);
        if(s[x].right!=-1) dfs(s[x].right,dep+1);
    }
    
    int main()
    {
        memset(flag,0,sizeof flag);
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            char L[5],R[5];
            scanf("%s%s",L,R);
            if(L[0]=='-') s[i].left=-1;
            else
            {
                int num=0;
                for(int k=0; L[k]; k++) num=num*10+L[k]-'0';
                s[i].left=num;
                flag[num]=1;
            }
    
            if(R[0]=='-') s[i].right=-1;
            else
            {
                int num=0;
                for(int k=0; R[k]; k++) num=num*10+R[k]-'0';
                s[i].right=num;
                flag[num]=1;
            }
        }
    
        for(int i=0; i<n; i++)
            if(flag[i]==0) root=i;
    
        dfs(root,0);
    
        if(Max_dep==0)
        {
            printf("YES %d
    ",g[Max_dep][g[Max_dep].size()-1]);
        }
        else
        {
            bool fail=0;
            for(int i=0; i<=Max_dep; i++)
            {
                if(i<Max_dep)
                {
                    if(g[i].size()==(int)pow(2.0,i)) {}
                    else fail=1;
                }
                else
                {
                    for(int j=0; j<g[i].size(); j=j+2)
                    {
                        if(j+1<g[i].size()&&j<g[i].size())
                        {
                            if(s[g[i-1][j/2]].left==g[i][j]&&s[g[i-1][j/2]].right==g[i][j+1]) {}
                            else fail=1;
                        }
                        else
                        {
                            if(s[g[i-1][j/2]].left==g[i][j]) {}
                            else fail=1;
                        }
                    }
                }
            }
    
            if(fail==1) printf("NO %d
    ",root);
            else printf("YES %d
    ",g[Max_dep][g[Max_dep].size()-1]);
        }
        return 0;
    }
  • 相关阅读:
    Promise
    includes()
    常见的数组去重方法
    concat()
    面试感想
    常见的前端面试题
    让div水平垂直居中的几种方法
    实现斐波拉契的几种方法
    使用lib-flexible
    什么是token
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5644692.html
Copyright © 2011-2022 走看看