【算法】多叉树寻找A\B节点的分支点
2015-04-25 11:24
302 查看
小米笔试中的一道题,题意是,多叉树,0为根节点,给定矩阵m,
m[i][j]==1表示两点连接,给出A,B两个节点,寻找他们的最近分支节点。
如题:
给出节点(3, 4)则最近分割点为2.
思路:类似于图的遍历,根据给出连接关系,找到每个节点的父节点,存入数组,对于给出的节点(3,4),依次找出3的父节点路径,然后找出4的路径,两者开始比对,最先相同的点即为分割点。
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; }
相关文章推荐
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 笔试算法题(36):寻找一棵二叉树中最远节点的距离 & 根据二叉树的前序和后序遍历重建二叉树
- Python实现的多叉树寻找最短路径算法示例
- 算法:在二叉树中寻找两个节点的共同祖先
- 寻找节点d=n的节点算法
- 算法:在二叉树中寻找两个节点的共同祖先
- 寻找链表中间节点-一种高效的算法
- 一颗普通的二叉树,如何寻找两个节点的最低公共祖先(发现的一个与算法无关的引用问题)
- js简单算法——寻找文档中所有元素节点
- 寻找链表中间节点-一种高效的算法
- 算法-寻找二叉树两个结点的最低共同父节点(OC实现)
- 算法---求一个多叉树中最多节点个数的层中节点的个数
- 【算法面试题】寻找二叉搜索树中两个节点的最近公共祖先节点(转)
- 寻找链表中间节点—一种高效的算法
- 记录一下另外一个,在棋盘上自动寻找最近的坐标节点的算法
- 小米笔试题:给一个多叉树,寻找多叉树上任意两点的最近共同父节点
- [算法]删除无序单链表中值重复出现的节点
- 寻找链表的倒数第N个节点
- 名企笔试:去哪儿2015研发笔试题(寻找Coder)2017-03-24 算法爱好者
- 算法为王:且看Mac Mini如何超越1636节点的Hadoop