/*
二叉树的宽度(即具有结点数最多的那一层的结点数)
思路:在二叉树的层次遍历算法的基础上修改
*/
#include <iostream>
#include <cstdlib>
#include <deque>
using namespace std;
typedef char ElemType;
typedef struct BitNode{
ElemType data;
struct BitNode *lchild, *rchild;
}*BiTree;
//创建二叉树
void CreateTree(BiTree &t){
char c;
cin >> c;
if(c=='#')
t = NULL;
else{
t = (BiTree)malloc(sizeof(BitNode));
t->data = c;
CreateTree(t->lchild);
CreateTree(t->rchild);
}
}
//求树的最大宽度
int getMaxBreath(BiTree T)
{
int cnt, max; //记录每层的结点数和最大的宽度
max = 0;
if(T == NULL) return 0;
deque<BiTree> q;
q.push_back(T);
int curLevelNum; // 当前层的节点数
while (q.size())
{
cnt = 0;
curLevelNum = (int)q.size(); // 此处要做类型转换,因为size()返回值为size_type类型;
while(curLevelNum-- > 0) // 一直访问到当前层的最后一个节点
{
BiTree tmp = q.front();
q.pop_front();
//printf("%c ", tmp->data);
cnt++;
if(tmp->lchild)
q.push_back(tmp->lchild);
if(tmp->rchild)
q.push_back(tmp->rchild);
}
//printf("\n"); // 当前层的元素输出完毕后,换行;
max = max>cnt?max:cnt;
}
return max;
}
int main(){
BiTree t;
cout << "请输入树的结点(先序,#代表空树):";
CreateTree(t);
cout << "树的最大宽度:" << getMaxBreath(t) << endl;
return 0;
}
程序小白,如果代码中有任何问题,欢迎指出。