这个题目主要考察的是层序遍历写法,确定父节点就好了

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix string字符串vector 
     * @param versionA int整型 
     * @param versionB int整型 
     * @return int整型
     */
    pair<vector<int>, vector<int>> findFatherNodes(vector<string>& matrix, int versionA, int versionB) {
        vector<int> ans(matrix.size(), -1);
        map<int, int> dict;
        // 层次遍历找到父节点
        queue<int> nodeQue;
        nodeQue.push(0);
        while (!nodeQue.empty()) {
            int i = nodeQue.front();
            nodeQue.pop();
            dict[i] = 1;
            // 找到 node 节点的所有子节点
            for (int j=0; j<matrix[i].size(); j++) {
                if (matrix[i][j] == '1' && !dict[j]) {
                    nodeQue.push(j);
                    ans[j] = i;              // 父节点为 i 
                }
            }
        }
        
        
        // 找到 A 的所有父节点
        vector<int> faNodesA={versionA}, faNodesB={versionB};
        while( ans[versionA] != -1) {
            faNodesA.push_back(ans[versionA]);
            versionA = ans[versionA];
        }
        // 找到 B 的所有父节点
        while ( ans[versionB] != -1 ) {
            faNodesB.push_back(ans[versionB]);
            versionB = ans[versionB];
        }
        return {faNodesA, faNodesB};
    }
    
    int findMinPubNodes(vector<int> faNodesA, vector<int> faNodesB) {
        // 公共节点
        int i = faNodesA.size()-1, j = faNodesB.size()-1; int pubNode;
        while (faNodesA[i] == faNodesB[j]) {
            if (i<0 || j<0) break;
            pubNode = faNodesA[i];
            i--;
            j--;
        }
        return pubNode;
    }
    
    
    int Git(vector<string>& matrix, int versionA, int versionB) {
        // 层次遍历找到两个节点的所有根节点
        pair<vector<int>, vector<int>> faNodesAB = findFatherNodes(matrix, versionA, versionB);
        return findMinPubNodes(faNodesAB.first, faNodesAB.second);
    }
};