寻找共同的父节点
2017-06-28 20:50
134 查看
git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0'或'1'组成,长度为n。matrix[i][j]=='1'当且仅当git树种第i个和第j个节点有连接。节点0为git树的根节点。)
参考了http://blog.csdn.net/shenxuan520/article/details/73832618
记录从根节点到带求节点A和B的路径。
比较路径,找到最近的公共节点。
参考了http://blog.csdn.net/shenxuan520/article/details/73832618
解题思路
从矩阵构造出父节点记录。记录从根节点到带求节点A和B的路径。
比较路径,找到最近的公共节点。
#include <iostream> #include <string> #include <vector> #include <stack> using namespace std; int getSplitNode(vector<string> matrix, int indexA, int indexB) { stack<int> s; if(indexA==indexB) return indexA; int len=matrix.size(); vector<int> father(len,-1);//父节点记录表 vector<int> flag(len,0);// 保证不重复入栈 s.push(0);//先将根节点入栈 flag[0] = 1; int count = 0; int temp;//记录当前栈顶 while(!s.empty()){ temp = s.top(); s.pop(); for(int count = 1; count<len;count++){ if(matrix[temp][count] == '1' && flag[count] ==0){ s.push(count); flag[count] = 1; father[count] = temp;//记录父节点 } } } vector<int> patha;patha.push_back(indexA); vector<int> pathb;pathb.push_back(indexB); int ta = indexA; int tb = indexB; while(father[ta] != -1){ patha.push_back(father[ta]); ta = father[ta]; } while(father[tb] != -1){ pathb.push_back(father[tb]); tb = father[tb]; } ta = patha.size()-1; tb = pathb.size()-1; while(ta>= 0 && tb >= 0 && patha[ta] == pathb[tb]){ ta--; tb--; } return pathb[tb+1];// or patha[ta+1] } int main() { // your code goes here vector<string> matrix; matrix.push_back("0001"); matrix.push_back("0001"); matrix.push_back("0001"); matrix.push_back("1110"); cout<<getSplitNode(matrix,3,2)<<endl; return 0; }
相关文章推荐
- 算法:在二叉树中寻找两个节点的共同祖先
- 算法:在二叉树中寻找两个节点的共同祖先
- 二叉树中寻找共同节点的最低公共祖先节点
- js简单算法——寻找文档中所有元素节点
- 寻找两个单链表中第一个相同的节点
- 寻找带环的单链表的换的入口位置处的节点
- 数据结构:单链表(五)之链表中寻找一个特定值,返回该节点值指针 回调函数
- 寻找二叉树某节点的路径
- 寻找最低公共父节点
- 二叉树寻找中序遍历的后继节点
- 【二叉树】寻找二叉树/BST的两个节点的最低公共祖先
- 单向还链表如何寻找起始节点
- 链表:寻找交叉节点
- 程序员面试金典-4.6寻找下一个节点
- [笔试面试]共同的祖先节点(淘宝2012校招)
- LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum
- 寻找链表中间节点-一种高效的算法
- 寻找三个有序数组的共同最小元素
- 寻找链表相交节点
- 剑指Offer :寻找链表中倒数第K个节点