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);
}
};