遍历树的递归,以计算节点的子节点未按预期工作

时间:2016-12-30 02:32:57

标签: c# recursion

非常基本的问题,我有一个方法循环遍历树中节点的所有子节点并对它们进行计数。问题是,计数器似乎没有正常工作,可能是由于一些范围问题。

public static void CountChildNodes(Node node, int counter)
{
    foreach (Node child in node.Children)
    {
        counter++;
        CountChildNodes(child, counter);
    }
}

计数器在递归的每次迭代后重置,最后它只重置为我开始的int。我希望计数器只是以初始节点所拥有的子节点数结束。有没有一个简单的解决方案,或者我处理这个问题的方式有问题吗?

3 个答案:

答案 0 :(得分:6)

它不起作用的原因是因为counter参数是按值传递的。这意味着当您将其作为参数传递时,值将被复制到一个全新的变量中。您对该变量所做的任何更改都不会影响您最初传递的变量。

例如,在此代码中:

int i = 5;
AddFiveToInt(i);
Console.WriteLine(i);

// Prints: 5

有两种方法可以解决这个问题。要么通过引用传递int

public static void CountChildNodes(Node node, ref int counter)
{
    foreach (Node child in node.Children)
    {
        counter++;
        CountChildNodes(child, ref counter);
    }
}

或者返回最新值:

public static int CountChildNodes(Node node)
{
    int counter = 0;

    foreach (Node child in node.Children)
    {
        counter++;
        counter += CountChildNodes(child);
    }

    return counter;
}

答案 1 :(得分:2)

那是因为counter通过值传递。改为通过ref

public static void CountChildNodes(Node node, ref int counter)

答案 2 :(得分:0)

试试这个,

public static int CountChildNodes(Node node)
{
        int c = 0;
        if ((node.Children == null) || (node.Children.Count == 0))
            return c;

        foreach (Node child in node.Children)
        {
            c++;
            c+=CountChildNodes(child);
        }
        return c;
}