/*
名称:求二叉树的高度。
说明:
(1)、这里Heigh0采用的求二叉树高度的方法本质上用的是非递归后序遍历的思想。基本的程序流程和非递归后序遍历差不多。在这里只能用后序遍历形成的二叉树,不能用先序或者中序,因为只有后序遍历的叉树在栈中,存放的才是一条从根节点到当前节点的路径,才可以用来计算根节点到当前结点的高度,从而判断出整个树的高度。
(2)、Heigh1用的是队列层次遍历的方法,设置一个标志指示每一层的最后一个结点,每当经过 这个标志,高度增加1
(3)、Heigh2用的是递归算法。
*/
int Heigh0(BiTree T)
{
stack<BiTNode *> _sta;
BiTNode *p = T,*r = NULL;
int heigh = 0,temp = 0;
while(p != NULL || !_sta.empty())
{
if(p != NULL)
{
if(++temp > heigh)
heigh = temp;
_sta.push(p);
p = p->lchild; //转向左子树
}
else //右结点
{
p = _sta.top(); //获取栈顶元素
if(p->rchild != NULL && p->rchild != r )
p = p->rchild;
else
{
r = p; //r指向当前结点,准备开始下一轮循环
_sta.pop();
--temp;
p = NULL; //此处p要设为空,否则下一轮循环会继续遍历p的左子树,而我们需要的是开始遍历栈中的下一个元素
}
}
}
return heigh;
}
int Heigh1(BiTree T)
{
if(T == NULL) //如果树为空,则直接返回0
return 0;
BiTNode* lay_last = NULL ,*p = NULL;
queue<BiTNode *> _que;
int heigh = 0;
_que.push(T);
lay_last = T;
while( !_que.empty())
{
p = _que.front();
{
if(p == lay_last) //如果当前访问的结点等于最后一个结点
{
++heigh; //高度加一
if(p->lchild != NULL)
_que.push(p->lchild); //入队
if(p->rchild != NULL)
_que.push(p->rchild);
lay_last = _que.back(); //队列的最后一个元素,即下一层的最后一个元素
}
else
{
if(p->lchild != NULL)
_que.push(p->lchild);
if(p->rchild != NULL)
_que.push(p->rchild);
}
_que.pop(); //当前结点的左右子树都访问完,出队
}
}
return heigh;
}
//递归求树的高度
int Heigh2(BiTree T)
{
int ldep;
int rdep;
if(T == NULL)
return 0;
else
{
ldep = Heigh2(T->lchild);
rdep = Heigh2(T->rchild);
}
if(ldep > rdep)
return ldep+1;
else
return rdep+1;
}