非遞迴中序遍歷 演算法導論12 1 3

2021-07-03 11:32:48 字數 1688 閱讀 2065

問題描述:

中序遍歷結果為:1 2 3 4 5 6 7 8 9

演算法實現:

//非遞迴用棧實現中序遍歷

void binarytree::non_recurse_using_stack_in_order_visit(node* root)

if(top >-1)}}

該演算法實現步驟如下:

以下全部實現**來自

#include 

#include

using namespace

std;

class

node

//node(int d);

node(int d, node* l, node* r);//建構函式的宣告

};class

binarytree;};

int main()

/*node::node(int d)

*/node::node(int d, node* l, node* r)

binarytree::binarytree(node* r)

//遞迴實現中序遍歷

void binarytree::recurse_in_order_visit(node* root)

}//非遞迴用棧實現中序遍歷

void binarytree::non_recurse_using_stack_in_order_visit(node* root)

if(top >-1)

}}//非遞迴且不用棧實現中序遍歷

void binarytree::non_recurse_non_stack_in_order_visit(node* root)

if ( !root->visited )

if ( root->right != null &&!root->right->visited )

else}}

執行結果:

遞迴中序遍歷的結果:

1 2 3 4 5 6 7 8 9

非遞迴用棧中序遍歷的結果:

top值 元素

2 1

1 2

0 3

0 4-15

0 6

0 7-18

-19非遞迴且不用棧中序遍歷的結果:

1 2 3 4 5 6 7 8 9

process returned 0 (0x0) execution time : 0.585 s

press any key to continue.

演算法導論12 1 3習題解答 非遞迴中序遍歷

clrs 12.1 3 演算法思想 1.採用棧的話,先尋找最左邊的節點,把經過的節點都存入棧中,第乙個被彈出來的為最左節點,那麼訪問其右子樹,對右子樹也像前面一樣遍歷,整個流程跟遞迴一樣。2.不採用棧的話,先是訪問最左節點,然後訪問其右子樹,然後回溯到最左節點的父節點,不斷重複這個過程,思路還是一樣...

非遞迴中序遍歷

非遞迴中序遍歷 中序遍歷的順序為 左 中 右,通過棧這個資料結構來記錄遍歷的歷史,思想如下 1.找到左子樹的底部葉子節點,列印葉子節點 期間將所有經過的節點壓棧,用於回退到父節點用 2.回退到葉子節點的父節點,列印父節點 在1走到左葉子節點的過程中,通過棧記錄下父節點 3.從父節點進入右兒子,再重複...

非遞迴中序遍歷二叉樹

非遞迴中序遍歷二叉樹 include define maxsize 100 typedef char datatype 二叉鍊錶型別定義 typedef struct binnode binnode,bintree 順序棧型別定義 typedef struct seqstk 初始化棧 int ini...