1 void PrintNodeAtLevel(BiTree T,int level) 2 { 3 // 空樹或層級不合理 4 if (NULL == T || level < 1 ) 5 return; 6 7 if (1 == level) 8 { 9 cout << T->data << " "; 10 return; 11 } 12 13 // 左子樹的 level - 1 級 14 PrintNodeAtLevel(T->leftChild, level - 1); 15 16 // 右子樹的 level - 1 級 17 PrintNodeAtLevel(T->rightChild, level - 1); 18 } 19 20 21 void LevelTraverse(BiTree T) 22 { 23 if (NULL == T) 24 return; 25 26 int depth = Depth(T); 27 28 int i; 29 for (i = 1; i <= depth; i++) 30 { 31 PrintNodeAtLevel(T, i); 32 cout << endl; 33 } 34 }
轉載:http://www.cnblogs.com/GoAhead/archive/2012/05/22/2513847.html
二叉樹的深度,遞歸和非遞歸實現
遞歸實現基本思想:
為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加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 }