Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表转换为树结构c_C#_Asp.net_Linq_Lambda - Fatal编程技术网

C# 表转换为树结构c

C# 表转换为树结构c,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,我有下面的数据结构,我想把它变成一棵树。我对递归有这样的想法,但我想知道是否有更有效/更好的方法 public class Structure { public int Id {get;set;} public int Level1 {get;set;} public int Level2 {get;set;} public int Level3 {get;set;} public int Level4 {get;set;} } var data = n

我有下面的数据结构,我想把它变成一棵树。我对递归有这样的想法,但我想知道是否有更有效/更好的方法

public class Structure
{
    public int Id {get;set;}
    public int Level1 {get;set;}
    public int Level2 {get;set;}
    public int Level3 {get;set;}
    public int Level4 {get;set;}
}

var data = new List<Structure> {
    new Structure{Id=1,Level1=1,Level2=11,Level3=35,Level4=105},
    new Structure{Id=2,Level1=1,Level2=11,Level3=35,Level4=106},
    new Structure{Id=3,Level1=1,Level2=11,Level3=36,Level4=107},
    new Structure{Id=4,Level1=1,Level2=11,Level3=36,Level4=108},
    new Structure{Id=5,Level1=1,Level2=11,Level3=36,Level4=109},
    new Structure{Id=6,Level1=1,Level2=11,Level3=36,Level4=110},
    new Structure{Id=7,Level1=1,Level2=11,Level3=36,Level4=111},
    new Structure{Id=8,Level1=2,Level2=12,Level3=37,Level4=112},
    new Structure{Id=9,Level1=2,Level2=12,Level3=37,Level4=113},
    new Structure{Id=10,Level1=2,Level2=12,Level3=37,Level4=114},
    new Structure{Id=11,Level1=2,Level2=12,Level3=37,Level4=115},
    new Structure{Id=12,Level1=2,Level2=12,Level3=37,Level4=116},
    new Structure{Id=13,Level1=2,Level2=12,Level3=38,Level4=117},
    new Structure{Id=14,Level1=2,Level2=12,Level3=39,Level4=118},
    new Structure{Id=15,Level1=2,Level2=12,Level3=39,Level4=119},
    new Structure{Id=16,Level1=2,Level2=12,Level3=40,Level4=120},
    new Structure{Id=17,Level1=2,Level2=12,Level3=40,Level4=121},
    new Structure{Id=18,Level1=2,Level2=12,Level3=40,Level4=122},
    new Structure{Id=19,Level1=2,Level2=12,Level3=40,Level4=123},
    new Structure{Id=20,Level1=2,Level2=12,Level3=40,Level4=124},
    new Structure{Id=21,Level1=2,Level2=12,Level3=40,Level4=125},
    new Structure{Id=22,Level1=2,Level2=12,Level3=41,Level4=126},
    new Structure{Id=23,Level1=2,Level2=12,Level3=41,Level4=127},
    new Structure{Id=24,Level1=3,Level2=13,Level3=42,Level4=128},
    new Structure{Id=25,Level1=3,Level2=13,Level3=43,Level4=129},
    new Structure{Id=26,Level1=3,Level2=13,Level3=44,Level4=130},
    new Structure{Id=27,Level1=3,Level2=13,Level3=45,Level4=131},
    new Structure{Id=28,Level1=3,Level2=13,Level3=45,Level4=132},
    new Structure{Id=29,Level1=3,Level2=13,Level3=46,Level4=133},
    new Structure{Id=30,Level1=3,Level2=13,Level3=47,Level4=134},
    new Structure{Id=31,Level1=3,Level2=13,Level3=47,Level4=135},
    new Structure{Id=32,Level1=3,Level2=13,Level3=47,Level4=136},
    new Structure{Id=33,Level1=3,Level2=13,Level3=48,Level4=137},
    new Structure{Id=34,Level1=3,Level2=14,Level3=49,Level4=138},
    new Structure{Id=35,Level1=3,Level2=14,Level3=49,Level4=141},
    new Structure{Id=36,Level1=3,Level2=14,Level3=49,Level4=142},
    new Structure{Id=37,Level1=3,Level2=14,Level3=49,Level4=143},
    new Structure{Id=38,Level1=3,Level2=14,Level3=49,Level4=144},
    new Structure{Id=39,Level1=3,Level2=14,Level3=50,Level4=145}
}

为什么不使用树,例如:

class TREE
{
    NODE root;

    public TREE(NODE root)
    {
        this.root = root;
    }


    public void insert(NODE node, NODE parent)
    {
        NODE temp = parent;
        if (temp.child == null)
            temp.child = node;
        else
        {
            temp = temp.child;
            insert(node, temp);
        }
    }


}
在另一侧,为节点创建一个类:


在我的示例中,节点被允许容纳唯一的子节点,您可以围绕此点工作,然后只插入节点

我假设您提出的递归解决方案是使用方法递归。如果树数据结构很深,那么可能会遇到堆栈空间问题。使用堆栈或类似工具将已有的隐式递归转换为方法内的显式递归

关于如何做到这一点,有很多建议,例如:


递归通常是解决问题的有效方法你有什么具体的想法吗?你能发布递归版本吗?你在寻找输出转储吗?或者你有一个结果对象模型吗?递归有时是解决问题的有效方法。使用树结构确实是递归非常有用的情况之一。你为什么不发布你正在使用的代码?它是否真的会导致性能问题,或者您只是对递归感到紧张?我做过类似的事情,但这仍然需要递归。我想看看是否有什么魔法可以消除递归。我希望没有递归的答案,但这一点是正确的!如果没有更好的解决方案出现,将标记为答案。
class TREE
{
    NODE root;

    public TREE(NODE root)
    {
        this.root = root;
    }


    public void insert(NODE node, NODE parent)
    {
        NODE temp = parent;
        if (temp.child == null)
            temp.child = node;
        else
        {
            temp = temp.child;
            insert(node, temp);
        }
    }


}
class NODE
{
    public int data;
    public NODE child;

    public NODE(int data)
    {
        this.data = data;

        child = null;
    }
}