之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题
问题:
1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。
2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
解决问题的思路:
- int BiTree_height1(BiTree T)函数用于计算出树的高度(深度);
- void levelOrder( BiTree T);创建了一个记录每层树的宽度数组width[totalLevel]
- void printNodeAtLevel(BiTree T,int level,int *width,int static_level) ;参数:有宽度数组的指针,和静态的层数(因为level会因为函数递归而改变,所以建立这一个)函数主体记录每一层节点数
- void levelOrder2(const BiTree T);设立一个变量,统计单分支结点的个数
- void printNodeAtLevel2(BiTree T,int level,int *single_branch);
核心代码
int BiTree_height1(BiTree T)//求树的深度算法1
{
if(T==NULL)
return 0;
else
{
if(BiTree_height1(T->lchild)>BiTree_height1(T->rchild))
return 1+BiTree_height1(T->lchild);
else
return 1+BiTree_height1(T->rchild);
}
}
void printNodeAtLevel(BiTree T,int level,int *width,int static_level)
{
if(T==NULL||level<0)
return;
if(level==0)
{
printf("%c ",T->data);
width[static_level]++;
return;
}
// 左子树的 level - 1 级
printNodeAtLevel(T->lchild,level-1,width,static_level);
// 右子树的 level - 1 级
printNodeAtLevel(T->rchild,level-1,width,static_level);
}
void levelOrder( BiTree T)
{
if(T==NULL)
return;
int totalLevel = BiTree_height1(T);
int width[totalLevel]={
0};
for(int i = 0; i< totalLevel; i++)
{
printNodeAtLevel(T, i,width,i);
printf("\t\t\t第%d层的宽度为:%d",i,width[i]);
printf("\n");//打印完一层,换行
}
int max_width=width[0],max=1;
for(int j=1;j<totalLevel<