如何为预订,后序,有序遍历编写GetEnumerator?

时间:2015-01-07 15:02:48

标签: c# foreach tree

我为BST编写了3种方法:

  1. 预购();
  2. 后序();
  3. 序();
  4. 它们都是递归方法,我必须在方法内打印值,但我想要的是返回值并将其打印在这些方法之外。
    我为InOrder编写了一个GetEnumerator(),但问题是我需要所有的树方法 一种方法是向数组添加值并返回数组,但这对性能不利,因为我们在代码中添加了一个数组。
    编辑:如何为所有我的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。

    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 :(得分: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);
}

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

作为实现GetEnumerator的一种方法,我建议你返回一个Dictionary&gt;&gt;包含像“preorder”,“postorder”和“inorder”这样的字符串作为键和IEnumerable&gt;作为您可以调用以前实现的方法的值。

希望它有所帮助,