【面經】用遞歸方法對二叉樹進行層次遍歷 && 二叉樹深度


 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  }

 

二叉樹的深度,遞歸和非遞歸實現

遞歸實現基本思想:

為了求得樹的深度,可以先求左右子樹的深度,取二者較大者加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 }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM