求二叉树的高度

/*
名称:求二叉树的高度。
说明:
(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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值