hihocoder 是二叉搜索树吗?(模拟题)

Posted Gealo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder 是二叉搜索树吗?(模拟题)相关的知识,希望对你有一定的参考价值。

 题目链接:http://hihocoder.com/problemset/problem/1616

 

题解:就是简单的模拟一下至于如何判断是不是二叉搜索树可以通过中序遍历将每个点存下来看是不是递增的如果是递增的就是反之不是

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int M = 1e4 + 10;
vector<int> vc[M];
int fa[M] , ch[M][2] , f[M] , n , emmm , num[M];
void init() {
    for(int i = 1 ; i <= n ; i++) {
        f[i] = i;
        vc[i].clear();
    }
}
int find(int x) {
    if(x == f[x]) return f[x];
    return f[x] = find(f[x]);
}
int cnt;
void cau(int u) {
    int len = vc[u].size();
    if(len == 2) {
        if(vc[u][0] == vc[u][1] || vc[u][0] == u || vc[u][1] == u) emmm = 1;
        cau(vc[u][0]);
        num[cnt++] = u;
        cau(vc[u][1]);
    }
    if(len == 1) {
        if(vc[u][0] == u) emmm = 1;
        if(vc[u][0] > u) {
            num[cnt++] = u;
            cau(vc[u][0]);
        }
        else {
            cau(vc[u][0]);
            num[cnt++] = u;
        }
    }
    if(len == 0) {
        num[cnt++] = u;
    }
}
void dfs(int u) {
    int len = vc[u].size();
    if(len == 1) {
        if(u > vc[u][0]) {
            putchar(();
            printf("%d" , vc[u][0]);
            dfs(vc[u][0]);
            putchar());
            putchar(();
            putchar());
        }
        else {
            putchar(();
            putchar());
            putchar(();
            printf("%d" , vc[u][0]);
            dfs(vc[u][0]);
            putchar());
        }
    }
    if(len == 2) {
        putchar(();
        printf("%d" , vc[u][0]);
        dfs(vc[u][0]);
        putchar());
        putchar(();
        printf("%d" , vc[u][1]);
        dfs(vc[u][1]);
        putchar());
    }
    if(len == 0) {
        putchar(();
        putchar());
        putchar(();
        putchar());
    }
}
int main() {
    int t;
    scanf("%d" , &t);
    while(t--) {
        cnt = 0;
        scanf("%d" , &n);
        memset(fa , -1 , sizeof(fa));
        int flag = 0;
        init();
        for(int i = 1 ; i <= n - 1 ; i++) {
            int u , v;
            scanf("%d%d" , &u , &v);
            vc[u].push_back(v);
            int a = find(u) , b = find(v);
            if(a == b) {
                flag = 1;
            }
            else {
                f[b] = a;
            }
            if(fa[v] == -1) {
                fa[v] = u;
                continue;
            }
            else {
                flag = 1;
            }
        }
        if(flag) {
            printf("ERROR1\n");
        }
        else {
            int tmp = 0;
            for(int i = 1 ; i <= n ; i++) {
                if(vc[i].size() == 0) continue;
                sort(vc[i].begin() , vc[i].end());
                if(vc[i].size() > 2) {
                    tmp = 1;
                    break;
                }
            }
            if(tmp) {
                printf("ERROR2\n");
            }
            else {
                emmm = 0;
                int root = 1;
                for(int i = 1 ; i <= n ; i++) {
                    if(fa[i] == -1) {
                        root = i;
                        break;
                    }
                }
                cau(root);
                for(int i = 1 ; i < cnt ; i++) {
                    if(num[i] <= num[i - 1]) {
                        emmm = 1;
                        break;
                    }
                }
                if(emmm) {
                    printf("ERROR3\n");
                }
                else {
                    putchar(();
                    printf("%d" , root);
                    dfs(root);
                    putchar());
                    puts("");
                }
            }
            
        }
    }
    return 0;
}

 

以上是关于hihocoder 是二叉搜索树吗?(模拟题)的主要内容,如果未能解决你的问题,请参考以下文章

L2-004 这是二叉搜索树吗?

L2-004. 这是二叉搜索树吗?

L2-004 这是二叉搜索树吗?(二叉树)

L2-004 这是二叉搜索树吗? (25 分) (树)

PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

Treap基本用法总结