0

Now I have a node class defined as follows

class Node
{
    public int Value { get; set; }
    public List<Node> Nodes { get; set; }
}

and a Node instance

Node r = new Node { Value = 1 };
Node n11 = new Node { Value = 2 };
Node n12 = new Node { Value = 3 };
Node n21 = new Node { Value = 4 };
Node n31 = new Node { Value = 5 };
r.Nodes = new List<Node> { n11, n12 };
n11.Nodes = new List<Node> { n21 };
n21.Nodes = new List<Node> { n31 };

How do I get the length (length = 4) of the longest path (r -> n11 -> n21 -> n31)?

2 Answers2

2

Use iteration so that you only need to input one parameter "Node".

static int GetDepth(Node root)
{
    if (root == null)
        return 0;

    List<Node> list1 = new List<Node>();
    List<Node> list2 = new List<Node>();
    List<Node> temp;

    list1.Add(root);
    int depth = 1;

    while (true)
    {
        foreach (Node node in list1)
        {
            if(node.Nodes!= null && node.Nodes.Any())
            {
                foreach (Node n in node.Nodes)
                {
                    list2.Add(n);
                }
            }
        }

        if (list2.Any())
            depth++;
        else
            return depth;

        list1.Clear();
        temp = list1;
        list1 = list2;
        list2 = temp;
    }
}
大陸北方網友
  • 3,696
  • 3
  • 12
  • 37
1

Use recursion function

    public void FindDepth()
    {
        Node r = new Node { Value = 1 };
        Node n11 = new Node { Value = 2 };
        Node n12 = new Node { Value = 3 };
        Node n21 = new Node { Value = 4 };
        Node n31 = new Node { Value = 5 };
        r.Nodes = new List<Node> { n11, n12 };
        n11.Nodes = new List<Node> { n21 };
        n21.Nodes = new List<Node> { n31 };

        int depth = FindDepth(r,1);// here you got it. depth = 4
        
    }

    public int FindDepth(Node n, int depth)
    {
        if( n == null || n.Nodes == null )
        {
            return depth;
        }

        int maxDepth = 0;
        for(int i = 0; i < n.Nodes.Count;i++)
        {
            int d = FindDepth(n.Nodes[i], depth + 1);
            if(d > maxDepth)
            {
                maxDepth = d;
            }
        }

        return maxDepth;
    }
TimChang
  • 2,249
  • 13
  • 25