LINTCODE——二叉树具有相同值的最长路径

来源:互联网 发布:minimax算法写程序 编辑:程序博客网 时间:2024/05/22 06:17

LINTCODE——二叉树具有相同值的最长路径

思路:这套题目做了挺久的,思路清楚了其实不难
首先,这道题目中的E数组(存储边数据的数组)我们需要处理一下,我用的方法是建立一个二维数组adj,adj[i]存储与i节点相连的节点编号;
其次:我们在进行深度优先搜索的时候,要用一个marked的容器,记录节点i是否被访问过,如果被访问过,直接跳过节点i,不然会进入死循环
最后:最长路径的数据处理和LINTCODE中二叉树的最大路径和处理方法一致,得到结果,成功AC
PS:由于这个花了我不少时间,所以代码部分个人觉得注释也比较详细;

class Solution {private:    //N为节点数    //adj[i]存储与i相连接的节点编号    int res = 0;    int N;    vector<vector<int>> adj;public:    /*     * @param : as indicated in the description     * @param : as indicated in the description     * @return: Return the number of edges on the longest path with same value.     */    int LongestPathWithSameValue(vector<int> &A, vector<int> &E) {        // write your code here        N = A.size();        adj = vector<vector<int>>(N);        //输入数据处理,把边保存到adj里面        for(int i = 0; i < N-1; i++)        {            //构造adj            addEdge(E[i*2]-1, E[i*2+1]-1);        }        for(int i = 0 ; i < N ; i++)        {            //建立一个容器marked判断节点i是否被访问过            vector<bool> marked(N, false);            depth(A, marked, i);        }        return res;    }    int depth(vector<int> &A, vector<bool> &marked, int index)    {        int L = 0, R = 0;        marked[index] = true;        bool flag = true;        //在与index相连接的节点里面寻找值相等并且没有被访问过的点,深度搜索        for(int j : adj[index])        {            //判断节点值是否与index的值相等           if(A[j] == A[index] && marked[j] == false)           {                //无法得知节点j是Index的左节点还是右节点                //但是这里只求路径长度,可以假定第一个匹配到的为左,第二个为右;                if(flag)                {                    L = depth(A, marked, j)+1;                    flag = false;                }                else                {                    R = depth(A, marked, j)+1;                }            }        }        //这个处理过程和二叉树的最大路径和类似,这里就不再多说了        res = max(res, L + R);        return max(L,R);    }    void addEdge(int v, int w)    {        adj[v].push_back(w);        adj[w].push_back(v);     }};
原创粉丝点击