找到最长的白色节点路径

时间:2013-02-13 08:22:47

标签: java c algorithm

在接受采访时提出这个问题: 给出了具有黑色和白色节点的树。找到给定树中最长的白色节点路径。下面的方法是正确的,或者有人帮助更好的方法,谢谢!

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.

3 个答案:

答案 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