1. 程式人生 > 其它 >二叉樹的遍歷(非遞迴)

二叉樹的遍歷(非遞迴)

迭代器

1. 關於迭代器

迭代:迭代是重複反饋過程的活動。

迭代器:迭代器是一種方法、get訪問器或運算子,它通過使用yield關鍵字對陣列或集合類執行自定義迭代。

YIELD返回語句:yield 返回語句會導致源序列中的元素在訪問源序列中的下一個元素之前立即返回給呼叫方。

狀態機的巢狀類:儘管您以方法的形式編寫迭代器,但編譯器會將其轉換為一個實際上是狀態機的巢狀類。只要客戶端程式碼中的 foreach 迴圈繼續進行,此類就會跟蹤迭代器的位置。

2. 迭代器概述

  1. 迭代器是可以返回相同型別的值的有序序列的一段程式碼。
  2. 迭代器可用作方法、運算子或 get 訪問器的程式碼體。
  3. 迭代器程式碼使用 yield return 語句依次返回每個元素。yield break 將終止迭代。
  4. 可以在類中實現多個迭代器。每個迭代器都必須像任何類成員一樣有唯一的名稱,並且可以在 foreach 語句中被客戶端程式碼呼叫,如下所示:foreach(int x in SampleClass.Iterator2){}。
  5. 迭代器的返回型別必須為 IEnumerable、IEnumerator、IEnumerable或 IEnumerator(可列舉的)。
  6. 迭代器是 LINQ 查詢中延遲執行行為的基礎。

其他:

yield 關鍵字用於指定返回的一個或多個值。到達 yield return 語句時,會儲存當前位置。下次呼叫迭代器時將從此位置重新開始執行。

迭代器對集合類特別有用,它提供一種簡單的方法來迭代複雜的資料結構(如二進位制樹)。

3. 迭代器的使用

  1. 建立迭代器最常用的方法是對 IEnumerable 介面實現 GetEnumerator 方法

  2. GetEnumerator 方法的存在使得型別成為可列舉的型別,並允許使用 foreach 語句。

例1:在本示例中,DaysOfTheWeek 類是將一週中的各天作為字串進行儲存的簡單集合類。foreach 迴圈每迭代一次,都返回集合中的下一個字串。

public class DaysOfTheWeek : System.Collections.IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}

例2:修改例1只返回需要的日期

 public class DaysOfTheWeek 
    {
        string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

        public System.Collections.IEnumerator GetEnumerator()
        {
            for (int i = 0; i < 2; i++)
            {
                yield return days[i];
            }
        }
    }
    class TestDestructors
    {
        static void Main()
        {
            // Create an instance of the collection class
            DaysOfTheWeek week = new DaysOfTheWeek();

            // Iterate with foreach
            foreach (string day in week)
            {
                System.Console.Write(day + " ");
            }
        }
    }