2014-11-12 5 views
0

У меня есть следующая структура данных и вы хотите превратить ее в дерево. У меня это работает с рекурсией, но было интересно, был ли более эффективный/лучший способ?Таблица в структуру дерева C#

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} 
} 

Так хочет выход выглядеть примерно так:

1 - 11 - 35 - 105 
      - 106 
     - 36 - 107 
      - 108 
      - 109 
      - 110 
      - 111 
..... 
..... 
..... 
3 - 14 - 49 - 138 
      - 141 
      - 142 
      - 143 
      - 144 
     - 50 - 145 
+1

рекурсии * вообще * эффективный способ решения проблем .. :) Что-нибудь конкретное вы имеете в виду? Можете ли вы опубликовать рекурсивную версию? –

+1

и вы ищете выходной свалку? или у вас есть результирующая объектная модель? – thewyzard

+0

Рекурсия * иногда * эффективный способ решения проблем. Работа с древовидными структурами действительно является одной из ситуаций, когда рекурсия полезна. Почему бы вам не опубликовать код, который у вас работает? На самом деле это вызывает проблемы с производительностью, или вы просто нервничаете из-за рекурсии? – Blorgbeard

ответ

0

Я предполагаю, что рекурсивное решение, которое вы придумали, использует рекурсию метода. Если структура данных дерева глубже, вы, вероятно, столкнетесь с проблемами со стеком. Преобразуйте неявную рекурсию, которую вы уже имеете, в явную рекурсию внутри метода, используя стек или аналогичный.

Существует множество советов о том, как сделать это, например:

+0

Наделся на отсутствие рекурсивного ответа, но действительная точка! будет отмечен как ответ, если не будет лучшего решения. – garethb

0

Почему не использовать дерево, как:

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); 
     } 
    } 


} 

С другой стороны, вы создаете класс для NODE:

class NODE 
{ 
    public int data; 
    public NODE child; 

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

     child = null; 
    } 
} 

В моем примере узлу разрешено удерживать уникальный дочерний элемент, вы можете обойти эту точку, а затем только вставлять свои узлы!

+0

Я сделал что-то подобное, но это все еще требует рекурсии. Я хотел посмотреть, есть ли какая-то магия, которая покончит с рекурсией. – garethb

Смежные вопросы