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

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); 
    }
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值