算法思想: 采用层次遍历的算法,设置变量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 }