#include<iostream>
using namespace std;
int x;
char c[100];
int flag;
int l = 1; //标记层数
int a[200]; //记录每层宽度,即结点数
typedef struct BiTNode
{
char data;
int level; //记录当前在第几层
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void Ceratbitree(BiTree& T, char s[], int& i)
{
if (s[i] == '0')
T = NULL;
else
{
T = new BiTNode;
T->data = s[i];
Ceratbitree(T->lchild, s, ++i);
Ceratbitree(T->rchild, s, ++i);
}
}
void JudgeBitree(BiTree T)
{
if (T)
{
JudgeBitree(T->lchild);
c[x++] = T->data;
if (x > 1 && c[x - 1] > T->data) {
flag = 0;
return;
}
JudgeBitree(T->rchild);
}
}
void Setlevle(BiTree& T) //设置结点level值
{
if (T)
{
if (T->lchild || T->rchild)
{
l = T->level;
++l;
}
if (T->lchild && T->rchild)
{
T->lchild->level = l;
T->rchild->level = l;
}
else if (T->lchild && !T->rchild)
T->lchild->level = l;
else
T->rchild->level = l;
Setlevle(T->lchild);
Setlevle(T->rchild);
}
}
void Count(BiTree T) //统计每层多少结点
{
if (T)
{
a[T->level]++;
Count(T->lchild);
Count(T->rchild);
}
}
int main()
{
BiTree T;
char s[200];
while (cin >> s && s[0] != '0')
{
int i = -1;
Ceratbitree(T, s, ++i);
x = 0;
flag = 1;
JudgeBitree(T);
if (flag)
cout << "是" << endl;
else
cout << "否" << endl;
l = 1;
Setlevle(T);
Count(T);
int max = a[1];
for (int i = 2; i < 200; i++)
{
if (max < a[i])
max = a[i];
if (a == 0)
break;
}
cout << max << endl;
l = 1;
for (int i = 1; i < 200; i++)
{
if (a == 0)
break;
a[i] = 0;
}
}
return 0;
}
二叉排序树判断,二叉树最大宽度计算(c++)
于 2022-03-23 10:28:33 首次发布