2015-01-07 3 views
-1

Я написал 3 метода для моего BST:Как написать GetEnumerator для предварительного заказа, Postorder, обход в порядке?

  1. PREORDER();
  2. PostOrder();
  3. InOrder();

Все они являются рекурсивными методами, и мне нужно напечатать значение внутри метода, но я хочу вернуть значение и распечатать его вне этого метода.
Я написал GetEnumerator() для InOrder, но проблема в том, что мне нужны все методы дерева.
Один из способов - добавить значения в массив и вернуть массив, но это плохо для производительности, потому что мы добавили массив в наш код.
Редактировать: Как я могу получить GetEnumerator для всех моих методов hree?

public void PreOrder(BinaryTreeNode<T> node) 
{ 
    if (node != null) 
    { 
     MessageBox.Show(node.Value.ToString()); 
     PreOrder(node.Left); 
     PreOrder(node.Right); 
    } 
} 

public void PostOrder(BinaryTreeNode<T> node) 
{ 
    if (node != null) 
    { 
     PostOrder(node.Left); 
     PostOrder(node.Right); 
     MessageBox.Show(node.Value.ToString()); 
    } 
} 

public void InOrder(BinaryTreeNode<T> node) 
{ 
    if (node != null) 
    { 
     InOrder(node.Left); 
     MessageBox.Show(node.Value.ToString()); 
     InOrder(node.Right); 
    } 
} 

GetEnumerator внутри класса BinaryTreeNode.

public IEnumerator<T> GetEnumerator() 
{ 
    if (Left != null) 
    { 
     foreach (var v in Left) 
     { 
      yield return v; 
     } 
    } 

    yield return Value; 

    if (Right != null) 
    { 
     foreach (var v in Right) 
     { 
      yield return v; 
     } 
    } 
} 
+1

Можете уточнить, что вы просите. Я пытаюсь найти вопрос. –

+0

Возникает вопрос, как поддерживать несколько перечислений в одной коллекции? –

+0

@AshBurlaczenko Посмотрите на% 00 - Внутренний комментарий об ошибке сервера. –

ответ

2

Я бы реализовать это следующим образом:

public class BinaryTree<T>{ 
    BinaryTreeNode<T> root; 

    #Your code.... 

    public IEnumerable<BinaryTreeNode<T>> PreOrder(){ 
     return DoPreorder(root); 
    } 

    public IEnumerable<BinaryTreeNode<T>> PostOrder(){ 
     return DoPostOrder(root); 
    } 

    public IEnumerable<BinaryTreeNode<T>> InOrder(){ 
     return DoInOrder(root); 
    } 

    private IEnumerable<BinaryTreeNode<T>> DoPreorder(BinaryTreeNode<T> node){ 
     if(node != null){ 
      yield return node; 
     } 
     else{ 
      yield break; 
     } 

     foreach(var leftNode in DoPreorder(node.Left)){ 
      yield return leftNode; 
     } 

     foreach(var rightNode in DoPreorder(node.Right)){ 
      yield return rightNode; 
     } 
    } 

    private IEnumerable<BinaryTreeNode<T>> DoPostOrder(BinaryTreeNode<T> node){ 
     if(node == null){ 
      yield break; 
     } 

     if(node.Left != null){ 
      foreach(var leftNode in DoPostOrder(node.Left)){ 
       yield return leftNode; 
      } 
     } 

     if(node.Right != null){ 
      foreach(var rightNode in DoPostOrder(node.Right)){ 
       yield return rightNode; 
      } 
     } 

     yield return node; 
    } 

    private IEnumerable<BinaryTreeNode<T>> DoInOrder(BinaryTreeNode<T> node){ 
     if(node == null){ 
      yield break; 
     } 

     if(node.Left != null){ 
      foreach(var leftNode in DoInOrder(node.Left)){ 
       yield return leftNode; 
      } 
     } 

     yield return node; 

     if(node.Right != null){ 
      foreach(var rightNode in DoInOrder(node.Right)){ 
       yield return rightNode; 
      } 
     } 
    } 
} 

Теперь, если вам нужно напечатать значения узлов в PREORDER, вы просто должны это сделать:

var tree = GetYourTree(); 

foreach(var node in tree.PreOrder()){ 
    Console.WriteLine(node.Value); 
} 

Другим подходом будет внедрение Preorder; PostOder и InOrder в качестве свойств.

Как один из способов реализации GetEnumerator, я предлагаю вам вернуть словарь >> содержащий строку, такую ​​как «preorder», «postorder» и «inorder» в качестве ключей и IEnumerable> в качестве значений, которые вы можете получить при вызове предыдущего реализованного методы.

Надеюсь, это поможет,

+0

@Riddle Удалить его и посмотреть сами. Когда вы запускаете код, вы просто получите Null Reference Exception. – Servy

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