C語言二叉樹非遞迴前序和中序

2021-10-10 20:52:22 字數 938 閱讀 6392

為什麼只有前序和中序呢?因為我自身事務比較多,所以也只是先把自己寫出來的東西分享給大家。(以下思路和內容純屬個人見解,如有不對請指正。)

既然已經看到了這篇部落格,那麼就是已經知道了什麼是二叉樹以及二叉樹的儲存結構,所以這裡不在贅述,只簡單講解一下三種遍歷的思路(幫助大家理解)

前序遍歷:

對於二叉樹的每乙個節點,都保證先訪問根結點,再訪問左節點然後是右節點。

例如二叉樹abc(a為左子樹,b為ac的父節點,c為右子樹),做前序遍歷時,就必須先訪問b然後是a其次是c。假如a有兩個子樹d(左子樹)和e(右子樹)呢,一樣的,要先訪問a,然後是d其次是e。所以從根結點b開始訪問,前序遍歷就是badec。

中序遍歷:

同上,保證每一次訪問,都是先訪問左子樹,然後父節點,最後右子樹。

後序遍歷:

同上,保證每一次訪問,都是先訪問左子樹,然後右子樹,最後父節點。

如果大家實在理解有點困難,不妨將將乙個大的二叉樹想成乙個個小的二叉樹,每乙個小的二叉樹僅有三個節點,對應左子樹,父節點,右子樹。讓這乙個個小的二叉樹按照上面的規則訪問,那麼大的二叉樹是不是也就按照規則來了呢?

好了=-= 如果還理解不了我就莫法了(qaq) 下面開始進入非遞迴前序和中序:

先建立乙個二叉樹吧(前序建立):

#include

#include

#include

#define crt_secure_no_warnings#define max 100typedef struct bitnode bitnode,bitree;

//bitnode是節點,bitree是根節點

非遞迴前序:

思路:由於我們採用遞迴演算法時,系統會幫我們開闢乙個隱式的棧來儲存尚未進入演算法的**,所以寫非遞迴我們需要自己開闢乙個棧來儲存那些沒有執行到的**。

二叉樹的遍歷 前序非遞迴和中序非遞迴

詳情可以見文章二叉樹建立和遞迴遍歷 建立如圖的二叉樹 就可以建立好上圖的二叉樹 非遞迴遍歷的演算法如下 include include using namespace std typedef char datatype 二叉樹的左右鏈表示,也叫做二叉鍊錶表示 typedef struct node ...

二叉樹的前序中序遞迴,非遞迴遍歷

二叉樹的前序,中序 遞迴,非遞迴遍歷 例如 二叉樹 6 14 4 8 12 16 前序遍歷的結果為 10 6 4 8 14 12 16 思路 非遞迴方法 先壓入根節點10 同時輸出資料 10 然後判斷 10有左子樹沒有,如果有則繼續壓入6 輸出 6 判斷6有沒有左子樹,如果有壓入 4,輸出 4.判斷...

二叉樹 非遞迴 前序 中序 後序 存檔

二叉樹 非遞迴 前中後序遍歷 其中root為空頭節點 root.left指向真實的二叉頭節點 其中前序與中序思路相同,列印節點輸出位置不同,後序要防止重複進入右節點 前序 節點入棧時立即輸出,中序 先入棧,後出棧時輸出,前序遍歷 public class dlr tmpnode stack.pop ...