注:本文是根据宽度定义的自拟题目,和 数据结构-二叉树-计算二叉树的高度-优快云博客有类似,但创建方式不同。
Description
根据输入构造二叉树,并输出二叉树的宽度。
说明:输入的第一行为根结点;第二行以后每行的第二元为第一元的左孩子,第三元为第一元的右孩子, 0表示空。
Sample Input
A
A B G
B 0 C
G 0 0
C D F
D 0 E
F 0 0
E 0 0
Sample Output
2
Hint
说明:输出有换行
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
typedef struct BiTnode
{ // 二叉树的存储结构
char data;
BiTnode *lc;
BiTnode *rc;
} BiTnode, *BiTree;
void initTree(BiTree &T)
{ // 初始化
T = new BiTnode;
T->lc = NULL;
T->rc = NULL;
}
queue<BiTree> Q;
void creatTree(BiTree &T)
{
char ch;
while (!Q.empty())
{
cin >> ch;
if (Q.front()->data == ch)
continue;
BiTree p, q;
if (ch != '0')
{
initTree(p);
p->data = ch;
Q.front()->lc = p;
Q.push(Q.front()->lc);
}
cin >> ch;
if (ch != '0')
{
initTree(q);
q->data = ch;
Q.front()->rc = q;
Q.push(Q.front()->rc);
}
Q.pop();
}
}
int width(BiTree T)
{ // 递归计算二叉树的深度
if (T == NULL)
{
return 0;
}
Q.push(T);
int w = 0, maxnum = 0;
BiTree p = NULL;
while (!Q.empty())
{
w = Q.size();
cout << w;
if (maxnum < w)
{ // 如果上一层的结点小于新一层的就更新
maxnum = w;
}
for (int i = 0; i < w; i++)
{ // 每一层的节点所有不为空的结点进队并把上一层的结点出队
p = Q.front();
Q.pop();
if (p->lc)
{
Q.push(p->lc);
}
if (p->rc)
{
Q.push(p->rc);
}
}
}
return maxnum;
}
int main()
{
BiTree Tree;
initTree(Tree);
cin >> Tree->data;
Q.push(Tree);
creatTree(Tree);
cout << width(Tree) << "\n";
return 0;
}