2016-12-30 42 views
2

非常基本的问题,我有一个方法可以遍历树中所有节点的子节点并对它们进行计数。问题是,柜台似乎没有正常工作,可能是由于一些范围问题。遍历树的递归计算节点的子节点不能按预期方式工作

​​

递归的每次迭代之后,计数器复位,并最终它只是重置为int我开始。我想让柜台简单地以最初节点的孩子数量结束。有没有简单的解决方案,或者我遇到这个问题的方式有什么问题吗?

+0

尝试'裁判INT counter'像[这个递归示例] (http://stackoverflow.com/a/19913489/3504007) –

回答

4

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

例如,在这个代码:

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

// Prints: 5 

有两种方法可以解决这个。

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

或者返回的最新值:要么你int按引用传递

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

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

    return counter; 
} 
+0

正是我在寻找和很好的解释,谢谢。 –

1

这是因为是通过值传递。改为通过ref

public static void CountChildNodes(Node node, ref int counter) 
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; 
}