【算法】多叉树寻找A\B节点的分支点

小米笔试中的一道题,题意是,多叉树,0为根节点,给定矩阵m,
m[i][j]==1表示两点连接,给出A,B两个节点,寻找他们的最近分支节点。
如题:

 "001001";
 "001100";
 "110010";
 "010000";
 "001000";
 "100000";
               0
             /    \
            2      5
           / \
          1   4
         /
        3

给出节点(3, 4)则最近分割点为2.
思路:类似于图的遍历,根据给出连接关系,找到每个节点的父节点,存入数组,对于给出的节点(3,4),依次找出3的父节点路径,然后找出4的路径,两者开始比对,最先相同的点即为分割点。

int h(vector<string>& m, int a, int b)
{
    if(m.size() == 0)
        return 0;
    vector<int> f(m.size(), 0);//表示父节点
    vector<int> lable(m.size(), 0);//标记是否标注过此点
    lable[0] = 1;//表示根节点已标记
    deque<int> note;//要查询的节点
    note.push_back(0);//从根节点开始
    int count = 1;//标记过的数目
    while(!note.empty())
    {
        if(count == m.size())
            break;//表示所有节点的父节点都记录完毕
        int i = note.front();
        note.pop_front();
        for(int  j = 0; j < m[i].size();j++)
        {
            if(m[i][j] == '1')
            {
                if(lable[j] == 0)
                {//表示找到当前节点的子节点,同时该节点未标记过
                    count++;
                    f[j] = i;
                    lable[j] = 1;
                    note.push_back(j);//将其子节点加入队列
                }

            }
        }
    }
    set<int> ip;//记录a节点的路径
    ip.insert(a);
    int ma = f[a];
    while(ma != 0)
    {//未到根节点
        ip.insert(ma);
        ma = f[ma];
    }
    int mb = b;
    while(mb != 0)
    {
        if(ip.count(mb))
            return mb;//若找到与a相同的节点即返回
        mb = f[mb];
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值