class Solution {
public:
//求根节点到目标节点(节点A或节点B)的路径path
bool IsInTree(vector<string> matrix,vector<int> &path,int target,int index){
//先把当前节点放入路径中,再判断当前节点是否是目标节点
path.push_back(index);
if (target==index){
return true;
}
//find表示当前节点的子节点是否包括了目标节点。
bool find=false;
for (unsigned i=0;(i<matrix[index].size())&&(find==false);i++){
if (matrix[index][i]=='1'){
unsigned j=0;
for (;j<path.size();j++){
if (path[j]==i){
break;
}
}
if (j==path.size()){
//i为当前节点的子节点(和当前节点有连接、不在之前的路径中)
find=IsInTree(matrix,path,target,i);
}
}
}
//如果当前节点的子节点不包括目标节点,则当前节点不在路径中
if (find==false){
path.pop_back();
}
return find;
}
//求路径pathA、pathB的分叉点
int FindNearst(vector<int> pathA,vector<int> pathB){
unsigned i=0;
while(i<pathA.size()&&i<pathB.size()&&pathA[i]==pathB[i]){
i++;
}
return pathA[i-1];//第一个不同的节点的前一个
}
int getSplitNode(vector<string> matrix, int indexA, int indexB) {
int n=matrix.size();
if (n==0){
return 0;
}
if (indexA==indexB){
return indexA;
}
vector<int> pathA,pathB;
IsInTree(matrix,pathA,indexA,0);
IsInTree(matrix,pathB,indexB,0);
return FindNearst(pathA,pathB);
}
};
通过邻接矩阵找到两个节点的最近公共祖先结点
最新推荐文章于 2022-11-25 17:03:50 发布