1. 程式人生 > >hihocoder 是二叉搜索樹嗎?(模擬題)

hihocoder 是二叉搜索樹嗎?(模擬題)

turn cnblogs sca hihocoder end oot sizeof 就是 如何

題目鏈接: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 是二叉搜索樹嗎?(模擬題)