常見的遍歷次序:(1)先序遍歷;(2)中序遍歷;(3)后序遍歷。
一、先序遍歷
先序遍歷:(1)訪問根節點;(2)采用先序遞歸遍歷左子樹;(3)采用先序遞歸遍歷右子樹;
(注:每個節點的分支都遵循上述的訪問順序,體現“遞歸調用”)
先序遍歷結果:A BDFE CGHI
思維過程:(1)先訪問根節點A,
(2)A分為左右兩個子樹,因為是遞歸調用,所以左子樹也遵循“先根節點-再左-再右”的順序,所以訪問B節點,
(3)然后訪問D節點,
(4)訪問F節點的時候有分支,同樣遵循“先根節點-再左--再右”的順序,
(5)訪問E節點,此時左邊的大的子樹已經訪問完畢,
(6)然后遵循最后訪問右子樹的順序,訪問右邊大的子樹,右邊大子樹同樣先訪問根節點C,
(7)訪問左子樹G,
(8)因為G的左子樹沒有,所以接下倆訪問G的右子樹H,
(9)最后訪問C的右子樹I
1 Status PreOrderTraverse(BiTree T,Status(* Visit)(TELemType e)){ 2 //采用二叉鏈表存儲結構,Visit是對數據元素操作的應用函數 3 //先序遍歷二叉樹的遞歸算法,對每個數據元素調用函數Visit。 4 //調用實例PreOrderTraverse(T,PrintElement); 5 if(T){ 6 if(Visit(T->data)) 7 if(PreOrderTraverse(T->lchild.Visit)) 8 if(PreOrderTraverse(T->rchild.Visit)) return ok; 9 return error; 10 } 11 else 12 return ok; 13 }
二、中序遍歷
中序遍歷:(1)采用中序遍歷左子樹;(2)訪問根節點;(3)采用中序遍歷右子樹
中序遍歷結果:DBEF A GHCI
三、后序遍歷
后序遍歷:(1)采用后序遞歸遍歷左子樹;(2)采用后序遞歸遍歷右子樹;(3)訪問根節點;
后序遍歷的結果:DEFB HGIC A
小結:三種方法遍歷過程中經過節點的路線一樣;只是訪問各個節點的時機不同。
遞歸算法主要使用堆棧來實現。