求树的最大宽度

所谓二叉树的宽度是指:二叉树各层节点个数的最大值。
我们知道层序遍历二叉树是使用deque来实现的:每次打印一个节点之后,如果存在左右子树,则把左右子树压入deque,那么此时的队列中可能既包含当前层的节点,也包含下一层的节点。

而我们要求的是对于特定某一层的节点的个数,因此我们需要从头结点开始,记录每一层的个数,对于当前层的每一个节点,在弹出自身之后把其左右子树压入deque,当把当前层全部弹出队列之后,在队列中剩下的就是下一层的节点。然后比较队列的size和之前得到的maxWidth,取最大值即为队列的宽度。最终队列为空,得到的maxWidth就是二叉树的宽度!

/* 二叉树的宽度      在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度*/
/************************************************************************/
int WidthOfBinaryTree(BinaryTreeNode*pNode){
    if (pNode == NULL)
    {
        return 0;
    }
    std::deque<BinaryTreeNode*> dequeTreeNode;//双端队列
    int maxWidth = 1;//最大的宽度,用于当只有一个节点时候返回1
    dequeTreeNode.push_back(pNode);//头结点入队
    while (true)
    {

        int length = dequeTreeNode.size();//当前层节点的个数
        if (length == 0)//当前层没有节点,跳出循环
        {
            break;
        }
        while (length > 0)//如果当前层还有节点
        {
            BinaryTreeNode* pTemp = dequeTreeNode.front();
            dequeTreeNode.pop_front();//出队
            length--;//长度减一
            if (pTemp->m_pLeft)
            {
                dequeTreeNode.push_back(pTemp->m_pLeft);//下一层节点入队
            }
            if (pTemp->m_pRight)
            {
                dequeTreeNode.push_back(pTemp->m_pRight);//下一层节点入队
            }
        }
        maxWidth = maxWidth > dequeTreeNode.size() ? maxWidth : dequeTreeNode.size();//得到最大宽度
    }
    return maxWidth;
}

二叉树系列——二叉树的宽度

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 10,056评论 1 31
  • 基于树实现的数据结构,具有两个核心特征: 逻辑结构:数据元素之间具有层次关系; 数据运算:操作方法具有Log级的平...
    yhthu阅读 9,838评论 1 5
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,665评论 0 12
  • 本文转自 http://www.cnblogs.com/manji/p/4903990.html二叉树-****你...
    doublej_yjj阅读 3,968评论 0 8
  • 什么是二叉树? 引用自百度百科:在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(...
    AnICoo1阅读 5,235评论 0 1

友情链接更多精彩内容