c#を使用してn-ary種類のデータ構造を実装しようとしています。ツリーにはルートノードと子の配列があり、子配列の各子にも子ノードのセットがあります。私がやろうとしているのは、リーフノードに存在するすべての子に追加する必要がある子配列を追加するときです。私のコードは
public void addChildren(Node root, Node[] children)
{
if (root.children == null)
{
root.children = children;
}
else
{
for (int i = 0; i < root.children.Length; i++)
{
addChildren(root.children[i], children);
}
}
}
メインプログラム
Dictionary<String, String[]> measurelist = new Dictionary<string, string[]>();
String[] values = { "y", "n" };
measurelist.Add("m1", values);
measurelist.Add("m2", values);
measurelist.Add("m3", values);
foreach (KeyValuePair<String, String[]> entry in measurelist)
{
Node[] children = new Node[entry.Value.Length];
for(int i = 0; i < entry.Value.Length ;i ++)
{
Node child = new Node(entry.Key+":"+entry.Value[i]);
children[i] = child;
}
clustertree.addChildren(clustertree.root, children);
}
しかし、このコードは無限の再帰呼び出しをもたらします。私は試しましたが、何が悪いのか理解できませんでしたか?私が間違っていることを見つけるのを手伝ってください。 私は画像で問題を説明しました
解決策: あなたの助けを借りて、私はこの問題の解決策を見つけました。根本的な原因を説明すると、同じ問題に直面する可能性のある他の人にも役立つと思います。ノードの子配列を渡すときの問題の主な原因は、値ではなく参照として渡されます。同じ子配列参照が次の再帰呼び出しに渡されないようにするために、コードを少し変更しました。
これが私の修正されたコードです:
public void addChildren(Node root, Node[] children)
{
if (root.children == null)
{
root.children = children;
}
else
{
for (int i = 0; i < root.children.Length; i++)
{
Node[] children1 = new Node[children.Length];
//I am creating a new array and nodes and passing the newly created array to the next recursive call
for (int j = 0; j < children.Length; j++)
{
Node node = new Node(children[j].key);
node.children = children[j].children;
children1[j] = node;
}
addChildren(root.children[i], children1);
}
}
}
再度、感謝します :)