2016校招真题-小米Git(找最近双亲)

来源:互联网 发布:vps建站 编辑:程序博客网 时间:2024/05/21 10:42

这里写图片描述

问题:找最近双亲问题 思想:找到indexA到0(根节点)的路径如:4->5->2->0 ; 再找到indexB到0(根节点)的路径如:1->2->0;找到两个路径后,从后往前,找到第一个两个路径不同的结点5与1,那么后一个结点2就是最近分割点。(其中:找路径用递归来解决,用一个visited数组记录结点是否被访问过,结束条件是:这个结点为0(根节点);)

class Solution {public:    /**     * 返回git树上两点的最近分割点     *      * @param matrix 接邻矩阵,表示git树,matrix[i][j] == '1' 当且仅当git树中第i个和第j个节点有连接,节点0为git树的跟节点     * @param indexA 节点A的index     * @param indexB 节点B的index     * @return 整型     */    int getSplitNode(vector<string> matrix, int indexA, int indexB){             vector<bool> visited(matrix.size(),false);        vector<int> path(matrix.size(),-1);        queue<int> qu;        qu.push(0);        while(!qu.empty()){            int now=qu.front();            qu.pop();            visited[now]=true;            for(int i=0;i<matrix.size();i++){                if(matrix[now][i]=='1'&&visited[i]==false){                    path[i]=now;                    qu.push(i);                }            }        }        stack<int> pathA;        stack<int> pathB;        while(indexA!=0){            pathA.push(indexA);            indexA=path[indexA];        }        pathA.push(0);        while(indexB!=0){            pathB.push(indexB);            indexB=path[indexB];        }        pathB.push(0);        int re;        while(!pathA.empty()&&!pathB.empty()&&pathA.top()==pathB.top()){            re=pathA.top();                   pathA.pop();            pathB.pop();        }        return re;    }};

(1)path数组用来记录每个节点的双亲,由于双亲是唯一的,所以可以用栈记录从indexA到root节点(0)路径所经过的所有节点。
(2)visited数组用来标记已经访问过的结点,因为matrix表示的结点是双向的,但树是单向的,我们只需要找出当前访问结点所有的子结点,并在path数组标记,同时这些子结点被push到pu队列,进行下一步的访问。
(3)pu队列用来存入子结点等待被访问,matrix是按层序遍历的。

0 0