['1361. 验证二叉树']

C++
class Solution {
public:
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
        vector<vector<int>> adj(n);
        vector<int> in(n, 0);
        for (int u = 0; u < n; u++) {
            int v = leftChild[u];
            if (v == -1) continue;
            adj[u].push_back(v);
            in[v]++;
        }
        for (int u = 0; u < n; u++) {
            int v = rightChild[u];
            if (v == -1) continue;
            adj[u].push_back(v);
            in[v]++;
        }

        int cnt = 0;
        int u = 0;

        for (int i = 0; i < n; i++) {
            if (in[i] == 0) {
                cnt++;
                u = i;
            }
        }
        if (cnt != 1) {
            return false;
        }

        queue<int> q;
        vector<int> vis(n, 0);
        q.push(u);
        vis[u] = 1;
        cnt = 1;
        while (q.size()) {
            int p = q.front();
            q.pop();
            for (auto& v : adj[p]) {
                cnt++;
                if (!vis[v]) {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }

        return cnt == n;
    }
};