算法思想: 采用層次遍歷的算法,設置變量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 }
