遞迴與非遞迴轉換的基礎知識是能夠正確理解三種樹的遍歷方法:前序,中序和後序,第一篇就是關於這三種遍歷方法的遞迴和非遞迴演算法。
前序遍歷:節點,左子樹,右子樹
中序遍歷:左子樹,節點,右子樹
後序遍歷:左子樹,右子樹,節點
如何用棧實現遞迴與非遞迴的轉換(一)三種遍歷樹的演算法
一.為什麼要學習遞迴與非遞迴的轉換的實現方法?
1)並不是每一門語言都支援遞迴的.
2)有助於理解遞迴的本質.
3)有助於理解棧,樹等資料結構.
二.三種遍歷樹的遞迴和非遞迴演算法
遞迴與非遞迴的轉換基於以下的原理:所有的遞迴程式都可以用樹結構表示出來.需要說明的是,這個"原理"並沒有經過嚴格的數學證明,只是我的乙個猜想,不過在至少在我遇到的例子中是適用的.學習過樹結構的人都知道,有三種方法可以遍歷樹:前序,中序,後序.理解這三種遍歷方式的遞迴和非遞迴的表達方式是能夠正確實現轉換的關鍵之處,所以我們先來談談這個.需要說明的是,這裡以特殊的二叉樹來說明,不過大多數情況下二叉樹已經夠用,而且理解了二叉樹的遍歷,其它的樹遍歷方式就不難。
了. 1)前序遍歷
a)遞迴方式:
void preorder_recursive(bitree t) /* 先序遍歷二叉樹的遞迴演算法 */ }
b)非遞迴方式
void preorder_nonrecursive(bitree t) /* 先序遍歷二叉樹的非遞迴演算法 */
pop(s,p);
if(!stackempty(s)) } }
2)中序遍歷
a)遞迴方式
void inorder_recursive(bitree t) /* 中序遍歷二叉樹的遞迴演算法 */ }
b)非遞迴方式
void inorder_nonrecursive(bitree t) }
}3)後序遍歷
a)遞迴方式
void postorder_recursive(bitree t) /* 中序遍歷二叉樹的遞迴演算法 */ }
b)非遞迴方式
typedef struct mark;
} pmtype; /* 有mark域的結點指標型別 */
void postorder_nonrecursive(bitree t) /*
後續遍歷二叉樹的非遞迴演算法 */
); /* 根結點入棧 */
while(!stackempty(s)) ); /* 修改mark域 */
if(a.ptr->lchild)
push(s,); /* 訪問左子樹 */
break;
case 1:
push(s,); /* 修改mark域 */
if(a.ptr->rchild)
push(s,); /* 訪問右子樹 */
break;
case 2:
visit(a.ptr); /* 訪問結點 */
} }
}
三種遍歷樹的演算法
遞迴與非遞迴轉換的基礎知識是能夠正確理解三種樹的遍歷方法 前序,中序和後序,第一篇就是關於這三種遍歷方法的遞迴和非遞迴演算法。如何用棧實現遞迴與非遞迴的轉換 一 三種遍歷樹的演算法 一.為什麼要學習遞迴與非遞迴的轉換的實現方法?1 並不是每一門語言都支援遞迴的.2 有助於理解遞迴的本質.3 有助於理...
樹的三種遍歷
目錄二叉樹的中序遍歷 遞迴 二叉樹的後序遍歷 遞迴 總結 中序遍歷的堆疊實現 非遞迴 層次遍歷的佇列實現 兩種遍歷確定唯一的二叉樹 必須含中序遍歷 1.先訪問根節點 2.左子樹遞迴呼叫先序遍歷 3.右子樹遞迴呼叫先序遍歷void preorder bintree bt a bdfe cghi 1.中...
三種遍歷樹的方法
樹的概念在開發裡面是很重要的一部分,xml的文件物件模型 dom 就是一棵樹,資料夾檔案的結構也是一棵樹。遍歷樹是開發中經常要遇到的乙個問題,比如,要找出dom裡面的img 標籤的個數,就要遍歷一棵dom樹。要在乙個目錄裡面查詢是否有乙個檔案也要用到遍歷這個目錄。在這裡我們以遍歷檔案為例,說明遍歷樹...