Рекурсивный вывод бинарного дерева
При рекурсивном выводе бинарного дерева выводится только корень(_head). Как исправить ?
public class BinaryTree<T>: IEnumerable<T> where T : IComparable<T>
{
private BinaryTreeNode<T> _head;
private int _count;
public IEnumerator<T> GetEnumerator()
{
return RevOrder(_head);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private IEnumerator<T> RevOrder(BinaryTreeNode<T> node)
{
if (node == null)
yield break;
if (node.Left != null)
{
RevOrder(node.Left);
}
if (node.Right != null)
{
RevOrder(node.Right);
}
yield return node.Value;
}
public int Count { get { return _count; } }
}
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Как вариант (проверьте сами, мне негде пока проверить)
public class BinaryTree<T> : IEnumerable<T> where T : IComparable<T>
{
private BinaryTreeNode<T> _head;
private int _count;
public IEnumerator<T> GetEnumerator()
{
return RevOrder(_head).GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
private IEnumerable<T> RevOrder(BinaryTreeNode<T> node)
{
if (node == null)
yield break;
if (node.Left != null)
foreach(var n in RevOrder(node.Left)) yield return n;
if (node.Right != null)
foreach(var n in RevOrder(node.Right)) yield return n;
yield return node.Value;
}
public int Count { get { return _count; } }
}
Автор решения: Stanislav Volodarskiy
→ Ссылка
Надо проитерироваться по поддеревьям и вывести их элементы. К сожалению, foreach отказыватеся работать с IEnumerator. Старый добрый while:
private IEnumerator<T> RevOrder(BinaryTreeNode<T> node)
{
if (node == null)
yield break;
if (node.Left != null)
{
var it = RevOrder(node.Left);
while (it.MoveNext()) {
yield return it.Current;
}
}
if (node.Right != null)
{
var it = RevOrder(node.Right);
while (it.MoveNext()) {
yield return it.Current;
}
}
yield return node.Value;
}