在接受采访时提出这个问题: 给出了具有黑色和白色节点的树。找到给定树中最长的白色节点路径。下面的方法是正确的,或者有人帮助更好的方法,谢谢!
int Longest(node root, int max)
{
if(root==null || root.color == black)
return 0;
if(root.color == white)
{
int curmax =1+ firstlongest(root.child) + secondlongest(root.child);
if(curmax>max)
max = curmax;
return curmax;
}
if(root.color == black)
{
for(all children)
{
int curmax =1+ firstlongest(root.child) + secondlongest(root.child);
}
if(curmax>max)
max =curmax;
return 0;
}
}
int firstlongest(node* child){//will calculate first longest of children and similarly
secondlongest gives second.Finally max will have length of longest path.
答案 0 :(得分:3)
<强>说明:强>
首先要记住如何在树中找到最长的路径。你取一个任意顶点 v ,用bfs找到离它顶点 u 最远的地方,然后找到离 u 顶点最远的 t < / strong>,再次使用bfs,(u,t)路径将是树中最长的路径。我不会在这里证明,你可以谷歌或试图证明自己(虽然如果你在一些例子中运行它,这是非常明显的。)
<强>解决方案:强>
现在你的问题。我们不需要黑色节点,所以让它们扔掉:)剩下的图形将是一个森林,即一组树木。使用已知算法找到每棵树的最长路径,并选择最长路径。
<强>复杂度:强>
描述算法将执行一个线性传递以移除黑色节点,并且针对林中的每个树执行两个线性bfs,其与图中的所有节点成线性关系。总计:O(n)+ O(n + m)+ O(n + m)= O(n + m)
答案 1 :(得分:2)
代码对我来说似乎不对。以下部分:
if(root.color == black)
{
for(all children)
{
int curmax = max(longest(root.child[i], max));
}
if(curmax>max)
max =curmax;
return 0;
}
将永远不会被执行,因为如果root.color == black
方法将提前返回0.
我将如何做到这一点:
private static int longestWhitePathFromRootLength (Node node)
{
if (node.color == BLACK)
return 0;
else // node.color == WHITE
{
int l = 0;
for (Node n: node.children)
{
l = Math.max (l, longestWhitePathFromRootLength (n));
}
return l + 1;
}
}
public static int longestWhitePathLength (Node node)
{
int l = 0;
for (Node n: node.children)
{
l = Math.max (l, longestWhitePathLength (n));
}
return Math.max (l, longestWhitePathFromRootLength (node));
}
答案 2 :(得分:2)
您的程序似乎只计算出下降的路径。假设所有节点都是白色的,它将错过此树中最长的路径:
r
/
a
/ \
b c
/ \
d e
最长的路径是dbace
。