Leetcode 1275 Solution

This article provides solution to leetcode question 1275 (validate-binary-tree-nodes)

https://leetcode.com/problems/validate-binary-tree-nodes

Solution

class Solution {
public:
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
        std::map<int, std::vector<int>> in_map;
        std::map<int, std::vector<int>> out_map;

        for (int i = 0; i < n; i++)
        {
            int left_child_node = leftChild[i];
            int right_child_node = rightChild[i];

            if (left_child_node != -1)
            {
                in_map[left_child_node].push_back(i);
                out_map[i].push_back(left_child_node);
            }

            if (right_child_node != -1)
            {
                in_map[right_child_node].push_back(i);
                out_map[i].push_back(right_child_node);
            }
        }

        int zero_in_degree_nodes = 0;
        int root_node = -1;
        for (int i = 0; i < n; i++)
        {
            int node_in_degree = in_map[i].size();

            if (node_in_degree == 0)
            {
                zero_in_degree_nodes++;
                root_node = i;
            }

            if (node_in_degree > 1)
                return false;
        }

        if (zero_in_degree_nodes != 1)
            return false;

        std::queue<int> q;
        q.push(root_node);
        int connected_size = 0;

        while (!q.empty())
        {
            int size = q.size();
            for (int i = 0; i < size; i++)
            {
                int node = q.front();
                q.pop();

                connected_size++;

                auto& out_nodes = out_map[node];
                for (auto it = out_nodes.begin(); it != out_nodes.end(); it++)
                    q.push(*it);
            }
        }

        return connected_size == n;
    }
};