您的位置:首页 > 其它

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

2015-04-25 11:24 302 查看
小米笔试中的一道题,题意是,多叉树,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐