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

    https://pintia.cn/problem-sets/994805046380707840/problems/994805049870368768

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

    输入格式:

    输入第一行给出一个不超过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 <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int N;
    int a[maxn];
    vector<int> v(maxn);
    vector<int> ans[maxn];
    int depth = -1, cnt = -1;
    
    struct Node{
        int val;
        struct Node *left, *right;
    };
    
    int Pow(int a, int b) {
        int ans = 1;
        if(b == 0) return 1;
        for(int i = 1; i <= b; i ++)
            ans *= a;
    
        return ans;
    }
    
    Node *BuildBST(Node *root, int x) {
        if(!root) {
            root = new Node();
            root -> val = x;
            root -> left = NULL;
            root -> right = NULL;
        } else if(x <= root -> val)
            root -> right = BuildBST(root -> right, x);
        else root -> left = BuildBST(root -> left, x);
    
        return root;
    }
    
    void dfs(Node* root, int step, int index) {
        if(!root) {
            depth = max(depth, step + 1);
            return;
        }
    
        v[step] ++;
        ans[step].push_back(root -> val);
        dfs(root -> left, step + 1, index * 2);
        dfs(root -> right, step + 1, index * 2 + 1);
    
        cnt = max(cnt, index);
    }
    
    int height(Node* root) {
        if(!root) return 0;
        return max(height(root -> left), height(root -> right)) + 1;
    }
    
    int main() {
        scanf("%d", &N);
        Node *root = NULL;
        for(int i = 0; i < N; i ++) {
            scanf("%d", &a[i]);
            root = BuildBST(root, a[i]);
        }
        dfs(root, 0, 1);
        bool flag = true;
        for(int i = 0; i < depth - 2; i ++) {
            if(v[i] != Pow(2, i)) {
                flag = false;
                break;
            }
        }
    
        for(int i = 0; i < depth; i ++) {
            for(int j = 0; j < ans[i].size(); j ++) {
                if(i == 0 && j == 0) printf("");
                else printf(" ");
                printf("%d", ans[i][j]);
            }
        }
        printf("
    ");
        if(height(root -> left) - height(root -> right) > 1) flag = false;
        if(cnt == N) printf("YES");
        else printf("NO");
        return 0;
    }
    

      还有一种建树一会写吧 

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10575196.html
Copyright © 2011-2022 走看看