1. 程式人生 > >2018/2/15 每日一學 手寫棧

2018/2/15 每日一學 手寫棧

調用 相同 遍歷 問題 http .com tps pre htm

我們知道,用遞歸解決的問題,必須滿足以下兩個條件:

  • 一個問題能夠分解成規模更小,且與原問題有著相同解的問題;
  • 存在一個能讓遞歸調用退出的簡單出口。

但是遞歸容易溢出,所以我們需要將遞歸轉變為非遞歸,這裏,我們學習堆棧模擬。

其實我們知道遞歸其實就是一種棧的模擬,我們不妨用一個棧來記錄我們需要的值,

不斷push(遞歸)直到盡頭,然後從盡頭開始完成我們需要的處理。

看看中序遍歷的代碼吧:(轉自https://www.cnblogs.com/coderkian/p/3758068.html)

void PreorderNonRecursive(Bitree root){
  stack stk;
  stk.push(root);
  
while(!stk.empty()){ p = stk.top(); visit(p); stk.pop(); if(p.rchild) stk.push(stk.rchild); if(p.lchild) stk.push(stk.lchild); } }

2018/2/15 每日一學 手寫棧