1. 程式人生 > >二叉樹遍歷的非遞迴演算法

二叉樹遍歷的非遞迴演算法

最近看了二叉樹一章的資料結構內容,知道樹這一章的遍歷,根據字元序列建立二叉樹,建立線索樹,樹與二叉樹的轉換,這些都涉及到了遞迴演算法,都是先將問問題規模縮小,利用森林與二叉樹之間的遞迴定義來巧妙的解決問題,看起來很複雜的問題,用遞迴很容易就解決了。

我們知道用遞迴演算法的時候是函式的不斷自我呼叫,知道到達截至條件,從中我們知道每次呼叫函式都要為函式分配空間(用於儲存呼叫函式的的變數,傳遞被呼叫函式的引數變數),這些函式呼叫是後進先出的,由此被稱作函式棧,它的性質與棧的後進先出是一致的。通過觀察棧的呼叫情況,我們可以從中得到遞迴演算法的非遞迴實現,其中函式棧通過自己建立一個棧的資料結構來實現。用這個棧配合程式碼,就能實現講遞迴演算法轉換為非遞迴演算法。

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

上一週的作業