2013-12-01 2 views
-1

Мне нужно создать дерево, как с помощью букв строки. , например: BAT дерево будет выглядеть следующим образомC# tree population

     # 
      /  |  \ 
       B  A  T 
      /\ /\ /\ 
      A T B T B A 
      | | | | | | 
      T A T B A B 

я попытался с помощью recursion..but всегда показывал переполнение стека. Может ли кто-нибудь предложить эффективный алгоритм для этого. Логика должна работать для любых букв. Я не добавил свой код здесь, потому что его совершенно неправильно. Я новичок в программировании с использованием структур данных.

Ниже приведен код, я написал:

    using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Tree_recursion 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      String str; 
      Console.WriteLine("Word : "); 
      str = Console.ReadLine(); 
      str = str + "*"; 
      int len = str.Length; 
      int i=0; 
      Char[] letters = new char[len]; 
      letters = str.ToCharArray(); 
      Node root = new Node('#'); 
      Node ret_node=new Node(); 
      for (int j = 0; j < len;j++) 
      { 
       i = j; 
       ret_node = root.Addnode(letters[i++]); 
      }            
     } 
    } 
    class Node 
    { 
     public char c; 
     public List<Node> Child = new List<Node>(); 
     public Node() 
     { 
     } 
     public Node(char ch) 
     { 
      Node n=new Node(); 
      n.c=ch; 
     } 
     public Node Addnode(char ch) 
     { 
      if (ch == '*') 
      { 
       return null; 
      } 
      else 
      { 
       Node n1 = Addnode(ch++); 
       this.Child.Add(n1); 
       return n1; 
      } 
     } 

    } 
} 
+0

Что это дерево должен содержать точно? Все перестановки из 3 букв? Можно ли повторять буквы? что ты уже испробовал? – fejesjoco

+0

Сочетания букв в слове .. – atm007

+0

после заполнения дерева считывается через каждую ветвь. Чтобы получить каждую из комбинаций. Я попробовал рекурсию, но не работает. – atm007

ответ

0

Это работает для меня.

Сначала определяют структуру дерева:

public class Tree<T> 
{ 
    public T Value { get; private set; } 
    public IEnumerable<Tree<T>> Children { get; private set; } 

    public Tree(T value, IEnumerable<Tree<T>> children) 
    { 
     this.Value = value; 
     this.Children = new List<Tree<T>>(children); 
    } 

    public string Dump() 
    { 
     return this.Dump(0); 
    } 

    protected string Dump(int level) 
    { 
     var query = 
      (new [] { "".PadLeft(level, '-') + this.Value.ToString() }) 
      .Concat(this.Children.Select(x => x.Dump(level + 1))); 

     return String.Join(System.Environment.NewLine, query); 
    } 
} 

структура вашего узла сделал вещи немного сложнее работать.

Тогда вы можете построить дерево вроде этого:

var text = "ABC"; 

Func<IEnumerable<char>, IEnumerable<Tree<char>>> build = null; 
build = xs => 
    from x in xs 
    select new Tree<char>(x, build(xs.Except(new [] { x }))); 

var tree = new Tree<char>('#', build(text)); 

Результата выполнения Dump на этом дереве:

# 
-A 
--B 
---C 
--C 
---B 
-B 
--A 
---C 
--C 
---A 
-C 
--A 
---B 
--B 
---A 
+0

ли это избежать дублирования? Каждая ветвь должна содержать букву только один раз. – atm007

+0

Как прочитать дерево вдоль каждой ветви, чтобы отображать каждую комбинацию букв. – atm007

+0

@ atm007 - Да, это позволяет избежать дублирования. Я создал метод «Дамп» для просмотра содержимого дерева. – Enigmativity