前序、后序、中序遍历如何写GetEnumerator?

How to write a GetEnumerator for Pre-order, Postorder, In-order traversal?

我已经为我的 BST 编写了 3 个方法:

  1. 预购();
  2. PostOrder();
  3. 有序();

它们都是递归方法,我必须在方法内部打印值,但我想要的是 return 值并在这些方法外部打印它。
我已经为 InOrder 写了一个 GetEnumerator(),但问题是我需要所有的树方法。
一种方法是将值添加到数组和 return 数组,但这对性能不利,因为我们在代码中添加了一个数组。
编辑:如何为我的所有 hree 方法设置 GetEnumerator?

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

BinaryTreeNode 中的 GetEnumerator class。

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

我会这样实现:

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

另一种方法是实施预购; PostOder 和 InOrder 作为属性。

作为实现 GetEnumerator 的一种方法,我建议您 return 一个字典>> 包含像 "preorder"、"postorder" 和 "inorder" 这样的字符串作为键和 IEnumerable > 作为值,您可以调用之前实现的方法。

希望对您有所帮助,