• 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;
    }
    

      还有一种建树一会写吧 

  • 相关阅读:
    3-8
    3-7
    3-5
    3-4
    3-3
    3-2
    3-1
    2-11
    2-10
    2-9
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10575196.html
Copyright © 2020-2023  润新知