问题:找最近双亲问题 思想:找到indexA到0(根节点)的路径如:4->5->2->0 ; 再找到indexB到0(根节点)的路径如:1->2->0;找到两个路径后,从后往前,找到第一个两个路径不同的结点5与1,那么后一个结点2就是最近分割点。(其中:找路径用递归来解决,用一个visited数组记录结点是否被访问过,结束条件是:这个结点为0(根节点);)
class Solution {
public:
/**
* 返回git树上两点的最近分割点
*
* @param matrix 接邻矩阵,表示git树,matrix[i][j] == '1' 当且仅当git树中第i个和第j个节点有连接,节点0为git树的跟节点
* @param indexA 节点A的index
* @param indexB 节点B的index
* @return 整型
*/
int getSplitNode(vector<string> matrix, int indexA, int indexB){
vector<bool> visited(matrix.size(),false);
vector<int> path(matrix.size(),-1);
queue<int> qu;
qu.push(0);
while(!qu.empty()){
int now=qu.front();
qu.pop();
visited[now]=true;
for(int i=0;i<matrix.size();i++){
if(matrix[now][i]=='1'&&visited[i]==false){
path[i]=now;
qu.push(i);
}
}
}
stack<int> pathA;
stack<int> pathB;
while(indexA!=0){
pathA.push(indexA);
indexA=path[indexA];
}
pathA.push(0);
while(indexB!=0){
pathB.push(indexB);
indexB=path[indexB];
}
pathB.push(0);
int re;
while(!pathA.empty()&&!pathB.empty()&&pathA.top()==pathB.top()){
re=pathA.top();
pathA.pop();
pathB.pop();
}
return re;
}
};
(1)path数组用来记录每个节点的双亲,由于双亲是唯一的,所以可以用栈记录从indexA到root节点(0)路径所经过的所有节点。
(2)visited数组用来标记已经访问过的结点,因为matrix表示的结点是双向的,但树是单向的,我们只需要找出当前访问结点所有的子结点,并在path数组标记,同时这些子结点被push到pu队列,进行下一步的访问。
(3)pu队列用来存入子结点等待被访问,matrix是按层序遍历的。