递归算法
int high(Tree r)
{
if(r==NULL)
return 0;
int left=high(r->lchild);
int right=high(r->rchild);
return (left>right? left:right)+1;
}
非递归算法
**每访问到一层的最右结点就高度+1,怎么定位每一层的最右结点呢??**
每进入一个结点,enquenumber就+1,这实质上是上一层全部出队列时把孩子都压入到队列中,最后压入得到的这一层的最后一个结点就是当前层的最右结点,并且它的序号是enquenumber,把这个序号再赋值给lastlevelNumber,这也有点像是一个递归过程,草稿纸上画图会理解得更加透彻.
int calculateTreeHeight(Tree r)
{
if(r == NULL)
return 0;
int visitedNumber = 0;
int enQueNumber = 1; //当前入队的序号,root为1
int lastLevelNumber = 1; //第一次最后一个结点的序号是1
int height = 0;
queue<Node*> q;
q.push(root);
while(!q.empty())
{
Node *node = q.front();
q.pop();
visitedNumber++;
if(node->left != NULL)
{
q.push(node->left);
enQueNumber++;
}
if(node->right != NULL)
{
q.push(node->right);
enQueNumber++;
}
//访问到当前level上的最后一个节点
if(visitedNumber == lastLevelNumber)
{
height++;
lastLevelNumber = enQueNumber;
}
}
return height;
}