遍歷二叉樹的非遞迴實現

2021-09-08 22:22:51 字數 1737 閱讀 3649

對於二叉樹來說,只要按照下面的模板可以很容易地實現先序、中序和後序的遞迴遍歷二叉樹。

void visit(treenode *node)

使用遞迴可以使**變得簡潔,明了。我們不用考慮計算機底層的遞迴工作棧是怎麼實現的,只要寫好遞迴式,給出遞迴終止條件,就可以把剩餘的計算工作交給計算機去執行。所以說遞迴是個好東東啊。但是追求真相的人,往往不會滿足於此的,一定弄明白背後的工作原理。

哈哈這就是古人云:"不可去名上理會。須求其所以然。"

ok,下面我把今晚寫的遍歷二叉樹的非遞迴演算法分享一下。

treenode *assiststack[maxsize];//

輔助棧模擬系統的遞迴工作棧

bool visited[maxsize] = ;//

設定訪問標誌位

void visit(char

value)

先序遍歷非遞迴實現

void preorderofnonrecurrence(treenode *root)

//將棧中的左子樹結點依次出棧,則先進去的結點最後出來。

//這樣對每個出棧的結點,判斷其是否有右子樹。如果有則將每個右子樹結點的左子樹入棧。

//記住只有入棧時才訪問結點。

while (top != -1

)

}else

}}

中序遍歷非遞迴實現

void inorderofnonrecurrence(treenode *root)

while (top != -1

) }}

}

後序遍歷非遞迴實現

void postorderofrecurrence(treenode *root)

while (top != -1

)

}while (visited[top] == true && top != -1

)

}}

上面**只對先序遍歷的非遞迴實現做了注釋,其它兩種沒有進行注釋,可以對比理解一下!

2023年3月30日補充:

先序遍歷二叉樹非遞迴方法:

void preorderofnorecu(binarytreenode *root)

q = stack[top--];

p = q->rchild;

if (p !=null)

stack[++top] =p;

}}

中序遍歷二叉樹非遞迴方法:

void inorderofnorecurrence(binarytreenode *root)

while (top != -1

)

}}

後序遍歷二叉樹非遞迴方法:

void postorderofnorecurrence(binarytreenode *root)

int top = -1

; binarytreenode *p, *q;

binarytreenode *node =root;

while

(node)

while (top != -1

)

while (visited[top] && top != -1

)

}}

二叉樹遍歷 遞迴 非遞迴實現

先序遍歷中序遍歷 後序遍歷 根結點 左子樹 右子樹 左子樹 根子樹 右子樹 左子樹 右子樹 根結點 先序遍歷 void preorder btree t 中序遍歷 void inorder btree t 後序遍歷 void postorder btree t 遞迴 recursion 就是子程式 ...

二叉樹遍歷的非遞迴實現

最近在看二叉樹的非遞迴呼叫,書上 寫的蠻清楚,但是一些細節需要深入的思考才會理解掌握。先根遍歷比較簡單,不斷的尋找根的左節點,並輸出,同時將對應節點的右節點壓入棧中,直到左節點為空,將棧頂元素出棧,作為根重複上述操作,直到棧為空。中根遍歷,將根節點左節點,左節點的左節點.依次入棧,直到最後乙個無左節...

二叉樹遍歷的非遞迴實現

二叉樹的構建使用的是鍊錶的形式,每個節點中既包含了根節點的元素,也包含了指向左右孩子的指標,實際可以看成乙個二維的線性結構。二叉樹的遍歷實質就是就二維變為一維的過程。前序遍歷的遞迴思想是 首先訪問根節點 然後以左子樹為根節點遞迴呼叫遍歷函式,這樣就沿著樹的最左邊的分支遍歷到最左邊的葉子節點 接著以右...