二叉樹迭代器(中序遞迴、前序和後序遍歷)演算法

Storm-Shadow發表於2020-11-23

二叉樹(Binary Tree)的前序、中序和後續遍歷是演算法和資料結構中的基本問題,基於遞迴的二叉樹遍歷演算法更是遞迴的經典應用。

假設二叉樹結點定義如下:

struct Node {
    int value;
    Node *left;
    Node *right;
}

中序遞迴遍歷演算法:

void inorder_traverse(Node *node) {
    if (NULL != node->left) {
        inorder_traverse(node->left);
    }
    do_something(node);
    if (NULL != node->right) {
        inorder_traverse(node->right);
    }
}

前序和後序遍歷演算法類似。

但是,僅有遍歷演算法是不夠的,在許多應用中,我們還需要對遍歷本身進行抽象。假如有一個求和的函式sum,我們希望它能應用於連結串列,陣列,二叉樹等等不同的資料結構。這時,我們可以抽象出迭代器(Iterator)的概念,通過迭代器把演算法和資料結構解耦了,使得通用演算法能應用於不同型別的資料結構。我們可以把sum函式定義為:

int sum(Iterator it)

連結串列作為一種線性結構,它的迭代器實現非常簡單和直觀,而二叉樹的迭代器實現則不那麼容易,我們不能直接將遞迴遍歷轉換為迭代器。究其原因,這是因為二叉樹遞迴遍歷過程是編譯器在呼叫棧上自動進行的,程式設計師對這個過

相關文章