二叉樹的三種遍歷

2022-03-10 23:52:42 字數 1963 閱讀 4301

前言:搞懂非遞迴和遞迴三種遍歷,二叉樹的90%的問題算你全搞定了。

先序遍歷:根,左子樹,右子樹

中序遍歷:左子樹,根,右子樹

後序遍歷:左子樹,右子樹,根

先序遍歷序列的特點:abcdefghijk  a是樹根,左子樹可能是bcdefgh右子樹可能是ijk  對於b左子樹可能是cd,右子樹可能是efgh。即,任一結點,它的右側的一段元素依次是左子樹,右子樹。

中序遍歷序列的特點:abcdefghijk   對任一結點,左側一段是它的左子樹,右側一段是它的右子樹。

後序遍歷序列的特點:abcdefghijk  k是樹根,對於任一結點,左側一段結點,從左向右依次是左子樹,右子樹。

根據先序中序 或 後序中序 能還原一棵二叉樹,根據 先序和後序 不能還原一棵二叉樹。

遞迴遍歷:

24

/*先序遞迴遍歷

*/25

void dlr(bitree *t) 31

} 32/*

中序遞迴遍歷

*/33

void ldr(bitree *t) 39

} 4041

/*後序遞迴遍歷

*/42

void lrd(bitree *t)

非遞迴遍歷

1

/*非遞迴中序遍歷*/2

void ldr_no_recursion(bitree *t)

12while (top != -1

) 18

if (top == -1)19

return;20

else28}

29}30}

31/*

後序非遞迴遍歷

*/32

void lrd_no_recursion(bitree *t)

46while (top != -1

) 52

else61}

62}63 }

view code

三種遍歷完整源**

1 #include"

標頭檔案.h"2

3 typedef struct

node bitnode,*bitree;

78 typedef struct

sbitnode;//

棧結點12

13/*

先序建立二叉樹

*/14

void createtree(bitree *t)

20else27}

28/*

先序遞迴遍歷

*/29

void dlr(bitree *t) 35}

36/*

中序遞迴遍歷

*/37

void ldr(bitree *t) 43}

44/*

非遞迴中序遍歷

*/45

void ldr_no_recursion(bitree *t)

55while (top != -1

) 61

if (top == -1)62

return;63

else71}

72}73}

74/*

後序遍歷

*/75

void lrd(bitree *t) 81}

82/*

後序非遞迴遍歷

*/83

void lrd_no_recursion(bitree *t)

97while (top != -1

) 103

else

112}

113}

114}

115int

main()

view code

執行結果:

二叉樹的三種遍歷

重新又看了一遍二叉樹 binary tree 發現很多東西自己還沒有弄明白,原來三種遍歷方式還不是自己想象中的那樣 前序遍歷 preorder 是先輸出自己,然後左,最後右。中序遍歷 inorder 是先左,再輸出自己,最後右。後序遍歷 postorder 是先左,再右,最後輸出自己。所謂的xx遍歷...

二叉樹的三種遍歷

在這裡說一下二叉樹的三種遍歷 前序,中序,後序 正文 前序遍歷 是指先從根開始,再依次找尋左子結點 右子結點。學習時的經驗就是 看圖學習 第乙份圖 這樣看來 1.先找最基本的根結點 詞窮 這裡是a。2.接著找以a為根結點的左子結點,這裡是b。3.而以b為根結點也會出現左右結點,這就又有了乙個左結點d...

二叉樹的三種遍歷

二叉樹是n n 0 個節點的有限集合,它或者是空樹 n 0 或者是有乙個根節點及兩顆不相交的且分別稱為左 右子樹的二叉樹所組成。可見,二叉樹同樣具有遞迴性質。特別需要注意的是,儘管樹和二叉樹的概念之間有許多聯絡,但它們是兩個不同的概念,樹和二叉樹之間最主要的區別是 二叉樹結點的子樹要區分左子樹和右子...