数据结构——二叉树的层次遍历进阶

这篇博客介绍了如何利用二叉树的层次遍历解决两个问题:计算二叉树的最大宽度和统计度为1的节点数目。通过`BiTree_height1`函数获取树的高度,`levelOrder`函数记录每层节点的宽度,`printNodeAtLevel`辅助函数用于处理每一层的节点数,`levelOrder2`和`printNodeAtLevel2`则用于计算单分支节点的数量。文章提供了完整的C语言实现代码。
摘要由CSDN通过智能技术生成

之前的一个博客
数据结构——二叉树的层次遍历看完这个,可以简单实现下面的问题

问题:

1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。
2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

解决问题的思路:
  1. int BiTree_height1(BiTree T)函数用于计算出树的高度(深度);
  2. void levelOrder( BiTree T);创建了一个记录每层树的宽度数组width[totalLevel]
  3. void printNodeAtLevel(BiTree T,int level,int *width,int static_level) ;参数:有宽度数组的指针,和静态的层数(因为level会因为函数递归而改变,所以建立这一个)函数主体记录每一层节点数
  4. void levelOrder2(const BiTree T);设立一个变量,统计单分支结点的个数
  5. 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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值