-1

ノードには複数のノードがある場合があるこのツリー構造があります。

public class Node
{
    public Node()
    {
        ChildLocations = new HashSet<Node>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public virtual int? ParentLocationId { get; set; }
    public virtual ICollection<Node> ChildLocations { get; set; }
}

parent-childここで、この構造に値のリストを追加します。お気に入り:

{1,A} -> {2,B}
{1,A} -> {3,C}
{1,A} -> {4,D}
{3,C} -> {5,E}
{3,C} -> {6,F}

ツリーを構築するには、次のようにします。

          1A
        / |  \
    2B    3C   4D
         / \ 
       5E   6F

最後に、root参照を返します。

私はこの解決策を出しました。しかし、再帰部分には自信がありません。これは正しいですか?

public class Tree
{
    Node root;

    public Node Root
    {
        get { return root; }
    }

    public void Add(int parentId, string parentName, int childId, string childName)
    {
        if (root == null)
        {
            root = new Node { Id = parentId, Name = parentName };
            root.ChildLocations.Add(new Node { Id = childId, Name = childName });
        }
        else
        {
            Add(root, parentId, parentName, childId, childName);
        }
    }

    private void Add(Node node, int parentId, string parentName, int childId, string childName)
    {
        if (node == null)
        {
            return;
        }
        if (node.Id == parentId)
        {
            node.ChildLocations.Add(new Node { Id = childId, Name = childName });
            return;
        }
        foreach (var n in node.ChildLocations)
        {
            Add(n, parentId, parentName, childId, childName);
        }
    }
}
4

1 に答える 1

0

あなたの質問に対する私のコメントによると、これはあなたが必要とするツリーを構築するために機能します:

public Node BuildTree()
{
    var _1A = new Node() { Id = 1, Name = "A", };
    var _2B = new Node() { Id = 2, Name = "B", };
    var _3C = new Node() { Id = 3, Name = "C", };
    var _4D = new Node() { Id = 4, Name = "D", };
    var _5E = new Node() { Id = 5, Name = "E", };
    var _6F = new Node() { Id = 6, Name = "F", };
    _1A.ChildLocations.Add(_2B);
    _1A.ChildLocations.Add(_3C);
    _1A.ChildLocations.Add(_4D);
    _3C.ChildLocations.Add(_5E);
    _3C.ChildLocations.Add(_6F);
    return _1A;
}

しかし、それはあまり一般的な目的ではありません。ニーズについて詳しく教えていただけますか?

于 2012-08-06T04:42:48.167 に答える