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


遞歸實現基本思想:

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