二叉樹遍歷的非遞迴演算法
阿新 • • 發佈:2019-02-18
最近看了二叉樹一章的資料結構內容,知道樹這一章的遍歷,根據字元序列建立二叉樹,建立線索樹,樹與二叉樹的轉換,這些都涉及到了遞迴演算法,都是先將問問題規模縮小,利用森林與二叉樹之間的遞迴定義來巧妙的解決問題,看起來很複雜的問題,用遞迴很容易就解決了。
我們知道用遞迴演算法的時候是函式的不斷自我呼叫,知道到達截至條件,從中我們知道每次呼叫函式都要為函式分配空間(用於儲存呼叫函式的的變數,傳遞被呼叫函式的引數變數),這些函式呼叫是後進先出的,由此被稱作函式棧,它的性質與棧的後進先出是一致的。通過觀察棧的呼叫情況,我們可以從中得到遞迴演算法的非遞迴實現,其中函式棧通過自己建立一個棧的資料結構來實現。用這個棧配合程式碼,就能實現講遞迴演算法轉換為非遞迴演算法。
void postOrderTraversalIterative(BinaryTree *root) { if (!root) return; stack<BinaryTree*> s; s.push(root); BinaryTree *prev = NULL; while (!s.empty()) { BinaryTree *curr = s.top(); if (!prev || prev->left == curr || prev->right == curr) { if (curr->left) { s.push(curr->left); } else if (curr->right) { s.push(curr->right); } else { cout << curr->data << " "; s.pop(); } } else if (curr->left == prev) { if (curr->right) { s.push(curr->right); } else { cout << curr->data << " "; s.pop(); } } else if (curr->right == prev) { cout << curr->data << " "; s.pop(); } prev = curr; // record previously traversed node } }
上一週的作業