У меня есть класс BinaryTree
и BinaryTreeNode
для хранения узлов, я уже создал дерево и написал для него предварительный порядок, порядок послепорядка и порядок заказа.
но я не знаю, как написать IEnumerator<T>
для него (я только хочу использовать in-order для метода GetEnumerator()
). Проблема заключается в том, что возвращаемый тип метода inOrder
void
. Я хочу сделать это IEnumerator<T>
и вместо возвращаемых данных MessageBox
.
Как я могу это сделать?
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);
}
}
public void Clear()
{
root = null;
Count = 0;
}
public IEnumerator<T> GetEnumerator()
{
InOrder(root);
return null; // error in forerach loop
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
Я думаю, что этой части моего кода достаточно.
Вот как я определил класс BinaryTree
:
public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T>
и вот как я определил BinaryTreeNode
:
public class BinaryTreeNode<T> : IComparable<T> where T : IComparable<T>
Вот один из способов сделать это, используя yield
:
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;
}
}
}
И вот более сжатый подход с использованием Linq:
public IEnumerator<T> GetEnumerator()
{
var leftEnumerable = (IEnumerable<T>)Left ?? new T[0];
var rightEnumerable = (IEnumerable<T>)Right ?? new T[0];
return leftEnumerable.Concat(new T[] { Value })
.Concat(rightEnumerable)
.GetEnumerator();
}
Изменить. Поскольку у вас, кажется, есть отдельные классы для BinaryTree
и BinaryTreeNode
, вы можете поместить любой из указанных выше в BinaryTreeNode
и поместить следующее в BinaryTree
:
public IEnumerator<T> GetEnumerator()
{
return Root.GetEnumerator();
}