遞歸實現基本思想:
為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加1即是樹的深度,遞歸返回的條件是若節點為空,返回0
算法:
1 int FindTreeDeep(BinTree BT){ 2 int deep=0; 3 if(BT){ 4 int lchilddeep=FindTreeDeep(BT->lchild); 5 int rchilddeep=FindTreeDeep(BT->rchild); 6 deep=lchilddeep>=rchilddeep?lchilddeep+1:rchilddeep+1; 7 } 8 return deep; 9 }
非遞歸實現基本思想:
受后續遍歷二叉樹思想的啟發,想到可以利用后續遍歷的方法來求二叉樹的深度,在每一次輸出的地方替換成算棧S的大小,遍歷結束后最大的棧S長度即是棧的深度。
算法的執行步驟如下:
(1)當樹非空時,將指針p指向根節點,p為當前節點指針。
(2)將p壓入棧S中,0壓入棧tag中,並令p執行其左孩子。
(3)重復步驟(2),直到p為空。
(4)如果tag棧中的棧頂元素為1,跳至步驟(6)。從右子樹返回
(5)如果tag棧中的棧頂元素為0,跳至步驟(7)。從左子樹返回
(6)比較treedeep與棧的深度,取較大的賦給treedeep,對棧S和棧tag出棧操作,p指向NULL,並跳至步驟(8)。
(7)將p指向棧S棧頂元素的右孩子,彈出棧tag,並把1壓入棧tag。(另外一種方法,直接修改棧tag棧頂的值為1也可以)
(8)循環(2)~(7),直到棧為空並且p為空
(9)返回treedeep,結束遍歷
1 int TreeDeep(BinTree BT ){ 2 int treedeep=0; 3 stack S; 4 stack tag; 5 BinTree p=BT; 6 while(p!=NULL||!isEmpty(S)){ 7 while(p!=NULL){ 8 push(S,p); 9 push(tag,0); 10 p=p->lchild; 11 } 12 if(Top(tag)==1){ 13 deeptree=deeptree>S.length?deeptree:S.length; 14 pop(S); 15 pop(tag); 16 p=NULL; 17 }else{ 18 p=Top(S); 19 p=p->rchild; 20 pop(tag); 21 push(tag,1); 22 } 23 } 24 return deeptree; 25 }