二叉树的宽度:树中最大的层节点数。
主要思路为:树不为空时,初始化父节点数(LastLevelWidth)为1(即头结点pop进队列),通过判断queue是否为空表示树全部节点遍历完成,以父结点数(LastLevelWidth)为while条件计算当层子结点数(CurLevelWidth更新LastLevelWidth,实现逐层遍历),当减自为0即表示该层结点遍历完成,将遍历的节点push进队列。每次都用?:记录最大的节点数,以便输出树的宽度。
typedef struct Node{
int data;
struct Node *Lchild,Node *Rchild;
}TreeNode;
int CountWidth(TreeNode *root)
{
if(root == NULL)
return 0;
int LastLevelWidth = 0;
int CurLevelWidth = 0;
int initWidth = 1;
queue<TreeNode *> myQueue;
myQueue.push(root);
LastLevelWidth = 1;
TreeNode *cur = NULL;
while(!myQueue.empty())
{
while(LastLevelWidth != 0)
{
cur = myQueue.front();
myQueue.pop();
if(cur->Lchild != NULL)
myQueue.push(cur->Lchild);
if(cur->.Rchild != NULL)
myQueue.push(cur->Rchild);
LastLevelWidth--;
}
CurLevelWidth = myQueue.size();//父结点数遍历完毕即队列内的便是当前层子结点
initWidth = LastLevelWidth > CurLevelWidth ? LastLevelWidt
: CurLevelWidth; //记录最大结点数
LastLevelWidth = CurLevelWidth;//更新,以便获取下一层结点数
}
}