數據結構用非遞歸算法求二叉樹高度


算法思想: 采用層次遍歷的算法,設置變量level記錄當前節點所在層數,設置變量last指向當前層的最右結點,每層遍歷出隊時與last指針比較,若兩者相等,則層數加一,並讓last指向下一層的最右結點即rear所在位置,直到變量完成。level的值即為二叉樹的高度。

代碼如下:

 1 int Btdepth(BiTree T)  2 {  3     if(T==NULL)          //樹空高度為0
 4         return 0;  5     int front=rear=-1;  6     int last=level=0;     //last指向當前層的最右結點
 7     BiTree Q[MAXSIZE];     //設置隊列Q,元素是二叉樹結點指針且容量足夠
 8     Q[++rear]=T;           //將根節點入隊
 9     BiTree p=T; 10     while(!IsEmpty(Q))      // 11  { 12         p=Q[++front];        //隊列元素出隊,即正在訪問的結點
13         if(p->lchild) 14             Q[++rear]=p->lchild;     //左孩子入隊
15         if(p->rchild) 16             Q[++rear]=p->rchild;        //右孩子入隊
17         if(front==last)       //訪問到該層的最后一個結點
18  { 19              level++;       //高度加一
20              last=rear;     //更新last指向下一層最右一個結點
21  } 22         
23  } 24     return level; 25 }

擴展:求某一層的結點個數,每層的結點個數、樹的最大寬度,都采用與此題類似的思想。當然,此題可采用遞歸算法,其實現如下

代碼如下:

 1 int Btdepth(BiTree T)  2 {  3     if(T==NULL)         //空樹高度為0
 4         return 0;  5     ldep=Btdepth(T->lchild);            //遞歸遍歷左子樹
 6     rdep=Btdepth(T->rchild);          //遞歸遍歷右子樹
 7     if(ldep>rdep)       //樹的高度為子樹的最大高度加根節點
 8         return ldep+1;  9     else
10         return rdep+1; 11 }

 


免責聲明!

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



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