class Solution {
public:
    bool helper(int nodeIdx, int nodeFrom, vector<vector<int> >& link, vector<int>& accessed){
        if(link[nodeIdx].empty())
            return true;

        if(accessed[nodeIdx]==1)
            return false;
        accessed[nodeIdx]=1;

        for(int i=0; !link[nodeIdx].empty(); i++){
            int childrenNode=link[nodeIdx].back();
            link[nodeIdx].pop_back();
            if(childrenNode!=nodeFrom){
                bool res = helper(childrenNode, nodeIdx, link, accessed);
                if(!res) return false;
            }
        }
        return true;
    }

    bool validTree(int n, vector<pair<int, int>>& edges) {
        if(edges.size()!=n-1)
            return false;

        vector<vector<int> > link(n);
        for(int i=0; i<edges.size(); i++){
            link[edges[i].first].push_back(edges[i].second);
            link[edges[i].second].push_back(edges[i].first);
        }

        for(int i=0; i<link.size(); i++){
            vector<int> accessed(n, 0);
            bool res = helper(i, i, link, accessed);
            if(!res)
                return false;
        }
        return true;
    }
};