之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题
问题:
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;j++)
{
if(width[j]>max_width)
{
max_width=width[j];
max=j+1;
}
}
printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);
}
void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{
if(T==NULL||level<0)
return;
if(level==0)
{
printf("%c ",T->data);
if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时
single_branch[1]++;
return;
}
// 左子树的 level - 1 级
printNodeAtLevel2(T->lchild,level-1,single_branch);
// 右子树的 level - 1 级
printNodeAtLevel2(T->rchild,level-1,single_branch);
}
void levelOrder2(const BiTree T)
{
if(T==NULL)
return;
int totalLevel = BiTree_height1(T);
int single_branch[1]={0};
for(int i = 0; i< totalLevel; i++)
{
printNodeAtLevel2(T, i,single_branch);
printf("\n");//打印完一层,换行
}
printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);
}
全部代码(可直接执行)
#include<stdio.h>
#include<bits/stdc++.h>
typedef char TElemType;
typedef int status;
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//二叉树的先序创建
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=(BiNode*)malloc(sizeof(BiNode));
if(!T)
exit(-1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void DestroyBiTree(BiTree &T)//二叉树的销毁算法
{
if(T==NULL)
exit(-1);
else
{
DestroyBiTree(T->lchild);
DestroyBiTree(T->rchild);
free(T);
}
}
int preorderTraverse(BiTree T)//二叉树的先序递归遍历算法
{
if(T==NULL)
return 0;
else
{
printf("%c ",T->data);
preorderTraverse(T->lchild);
preorderTraverse(T->rchild);
}
}
int InorderTraverse(BiTree T)//二叉树的中序递归遍历算法
{
if(T==NULL)
return 0;
else
{
InorderTraverse(T->lchild);
printf("%c ",T->data);
InorderTraverse(T->rchild);
}
}
int PostorderTraverse(BiTree T)//二叉树的后序递归遍历算法
{
if(T==NULL)
return 0;
else
{
PostorderTraverse(T->lchild);
PostorderTraverse(T->rchild);
printf("%c ",T->data);
}
}
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;j++)
{
if(width[j]>max_width)
{
max_width=width[j];
max=j+1;
}
}
printf("最大宽度为%d,首先出现最大宽度的是第%d层",max_width,max);
}
void printNodeAtLevel2(BiTree T,int level,int *single_branch)
{
if(T==NULL||level<0)
return;
if(level==0)
{
printf("%c ",T->data);
if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)//单分支时
single_branch[1]++;
return;
}
// 左子树的 level - 1 级
printNodeAtLevel2(T->lchild,level-1,single_branch);
// 右子树的 level - 1 级
printNodeAtLevel2(T->rchild,level-1,single_branch);
}
void levelOrder2(const BiTree T)
{
if(T==NULL)
return;
int totalLevel = BiTree_height1(T);
int single_branch[1]={0};
for(int i = 0; i< totalLevel; i++)
{
printNodeAtLevel2(T, i,single_branch);
printf("\n");//打印完一层,换行
}
printf("该树的单分支节点(即度为1的节点)数为:%d",single_branch[1]);
}
int main()
{
BiTree T;
printf("创建树输入树T的先序序列(其中使用#代表空节点)\n");
CreateBiTree(T);
printf("先序遍历算法");
preorderTraverse(T);
printf("\n中序遍历算法");
InorderTraverse(T);
printf("\n后序遍历算法");
PostorderTraverse(T);
printf("\n二叉树层次遍历算法\n");
levelOrder(T);
printf("\n二叉树层次遍历算法\n");
levelOrder2(T);
}
例如:


1406



被折叠的 条评论
为什么被折叠?



