通过邻接矩阵找到两个节点的最近公共祖先结点

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);
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值