前言:搞懂非遞迴和遞迴三種遍歷,二叉樹的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)
1view code/*非遞迴中序遍歷*/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 }
三種遍歷完整源**
1 #include"view code標頭檔案.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()
執行結果:
二叉樹的三種遍歷
重新又看了一遍二叉樹 binary tree 發現很多東西自己還沒有弄明白,原來三種遍歷方式還不是自己想象中的那樣 前序遍歷 preorder 是先輸出自己,然後左,最後右。中序遍歷 inorder 是先左,再輸出自己,最後右。後序遍歷 postorder 是先左,再右,最後輸出自己。所謂的xx遍歷...
二叉樹的三種遍歷
在這裡說一下二叉樹的三種遍歷 前序,中序,後序 正文 前序遍歷 是指先從根開始,再依次找尋左子結點 右子結點。學習時的經驗就是 看圖學習 第乙份圖 這樣看來 1.先找最基本的根結點 詞窮 這裡是a。2.接著找以a為根結點的左子結點,這裡是b。3.而以b為根結點也會出現左右結點,這就又有了乙個左結點d...
二叉樹的三種遍歷
二叉樹是n n 0 個節點的有限集合,它或者是空樹 n 0 或者是有乙個根節點及兩顆不相交的且分別稱為左 右子樹的二叉樹所組成。可見,二叉樹同樣具有遞迴性質。特別需要注意的是,儘管樹和二叉樹的概念之間有許多聯絡,但它們是兩個不同的概念,樹和二叉樹之間最主要的區別是 二叉樹結點的子樹要區分左子樹和右子...