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

数据结构 树 层次遍历二叉树 C语言版 //层次遍历二叉树并输出结点的算法 #include #include typedef struct NNode { char data; struct NNode *LChild; struct NNode *RChild; } BiTNode,*BiTree; //定义二叉树结点和结点指针 typedef BiTree QueueElementType; typedef str 阅读详情

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

问题:

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;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);
	
	
 } 

例如:
在这里插入图片描述

在这里插入图片描述

数据结构-二叉树层次遍历 首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历;思路如下: 先将二叉树根节点入队,然后出队,访问该节点,如果有左子树,则将左子树根节点入队;如果有右子树,则将右子树根节点入队。然后出队,对出队节点访问,如此循环 直到队列为空。 代码实现: // // Created by Ad... 阅读详情

相关推荐

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

知识前提:循环队列,二叉树的基本运算 //思路 进行层次遍历时构建一个辅助队列,先将二叉树根节点入队,然后出队,访问出队结点,若它有左子树,将左子树根节点入队,然后出队,访问出队结点…,右子树也同样如此,循环往复直到队列为空 1.构建好辅助队列Q和二叉树T; 2.首先将二叉树的T(根节点)入队列; 3.进入while循环,退出条件 :队列为空; 4.循环内部:首先将队列中的队首元素。输出他的值; 若队首元素(刚刚出队的元素)有左子树,将其左子树入队 若队首元素(刚刚出队的元素)有右子树,将其右子树入队 详细

qq_50675813的博客 1406

用层次遍历二叉树的方法统计二叉树中度为1的结点的个数

在之前的博客中,我们已经掌握了使用辅助队列来实现二叉树层次遍历的算法. 既然是"遍历",那么二叉树中的每个结点在一次操作中都会被访问到:基于此,我们对遍历时的操作稍加修改,便可统计二叉树中度为1的结点的个数. (※)这里再说明一下判断结点度是否为1的方法:如果某结点的左孩子为空且右孩子不空或左孩子不空且右孩子为空,那么该结点的度就为1. 根据分...

weixin_42048463的博客 1万+

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 278

数据结构——树与二叉树

树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0);或为非空树,对于非空树T:有且仅有一个称之为根的结点;除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。下面是两个关于树的示例,第一张图中是一个普通树,而第二张图中是一个二叉树。二叉树()是nn≥0)个结点所构成的集合。

Oliver0207的博客 671

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

跨境电商ERP开发之Shopee开发者账号申请

引言:由于电子信息技术和经济全球化的进一步发展,电子商务在国际贸易中的影响力和关键作用日渐突显,已变成中国出口贸易的市场趋势。跨境电商未来的发展前景必定是有助于减少经济成本、推动全球贸易便利化,有助于提高国内群众福祉,有助于打造良好的营商环境,从而推动经济长期健康发展。 gitee仓库地址: https://gitee.com/naturalwish/SSERP/tree/master 以下授权教学同ShopeeOpen Platform - Developer Guide 申请流程 ..

naturalwish的专栏 3641

C语言二叉树层次遍历和通过层次遍历找出度为1的结点

层次遍历算法: void _PrintTree_f5(BiTree a) { LinkQueue b; b=InItQueue(); EnQueue(&b,a); while(!QueueEmpty(b)) { BiTree d; d=getFront(b); printf("%c\n",d->data); if(d->lchild) { EnQueue(&b,d->lchild); } if(d->rchild) .

qq_58190943的博客 2589

BES (恒玄)HFP通话笔记

1.audio_developer 调试:SDK 需要打开某个算法,需要原厂打开对应宏定义编译出新的SDK,只要涉及到lib库里的功能都需要原厂手动修改编译。开发商和原厂FAE做起来都会比较累。如果没有原厂支持根本没法做,很少文档,SDK也很多问题,没法开箱即用如果要支持audio_developer上位机调试,还需改代码,如果对整个原理不清楚就没法做,没文档只能啃代码调试工具设计的也有待加强,串口通讯调试对耳机这类产品非常麻烦,本来板子就不大,还要焊接一堆线,调试还要拖着串口线。

飞天鱼 689

算法:统计结点度为1的个数

在一棵以二叉链表表示的二叉树上,试编写一个算法,完成如下功能: 按层次顺序遍历二叉树,并统计树中具有度为1的结点数目。 int Level(BiTree *bt) { int num=0 //num统计度为1的结点个数 if(bt){ QueueInit(Q);QueueIn(Q,bt); //Q是以二叉树结点指针为元素的队列 while(!QueueEmpty(Q)) { p=QueueOut(Q);printf(p->data); //出队,访问结点 if(p-&

qq_46152966的博客 2868

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3152

通过FlinkCDC将MySQL中变更的数据写入到kafka(DataStream方式)

文章目录前言一、CDC的种类?二、通过FlinkCDC将数据从MySQL导入到Kafka1.核心代码2.工具类3.可能会出现的错误及解决解决: 前言 CDC的Change Data Capture(变更数据捕获)的缩写 FlinkCDC的核心思想是监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。 一、CDC的种类? CDC 主要分为基于查询和基于 Binlog 两种方式,简述两者的区别:

不会打球的摄影师不是好程序员 9622

统计二叉树中度为1的节点,层序遍历实现

#include <iostream> #include<bits/stdc++.h> using namespace std; typedef struct node{ struct node *lchild,*rchild; int data; }treeno,*treenode; void cretree(treenode &root){ int x; cin>>x; if(x){ root=new treeno; root->data...

喝泉水的泉 1259

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4498

python 二叉树遍历

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon May 13 15:48:30 2019 @author: lg """ class Node(): #节点类 def __init__(self,data = -1): self.data = data self....

luoganttcc的博客 1065

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

二叉树 层次遍历

给定一颗二叉树,依次从根节点一层一层返回节点 基本思路:利用队列模拟这一过程 根节点入队列 取队列头节点 若该节点还有左右节点  入队列 之道队列为空 二叉树结构 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...

一只老风铃 414

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

(数据结构)二叉树层次遍历

二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队;而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果 图1 二叉树 以上图 1 为例,层次遍历的过程如下: 首先,根结点 1 入队 根结点 1 出队,出队的同时,将左孩子 2 和右孩子 3 分别入队 队头结点 2 出队,出队的同时,将结点 2 的左孩子 4 和右孩子 5 依次入队 队头结点 3 ...

weixin_51927215的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

利用队列对二叉树进行层次遍历

利用队列对二叉树进行层次遍历,需要实现:1队列数据结构,并实现出队,入队,判断队列是否为空三个函数操作2二叉树数据结构,并实现创建二叉树,层次遍历二叉树两个函数操作层次遍历的算法思想及代码如下图所示/*利用队列对二叉树进行层次遍历*/#include&lt;iostream&gt;using namespace std;#define maxsize 100/*定义队列的存储容量*/typedef...

canaanxu的博客 6869

Java 二叉树层次遍历

Java 二叉树层次遍历

tracy的博客 7201

详细谈谈二叉树的层次遍历

层次遍历是一种直观且常用的遍历二叉树的方法,它从根节点开始,逐层访问每个节点,确保按照层次顺序输出节点的值。通过使用队列,我们可以轻松实现这一遍历算法。希望这篇简短的博客能够帮助你理解二叉树的层次遍历算法。如果有任何疑问或建议,请随时提出。

double222222的博客 1459

二叉树的遍历——层次遍历

上一节:二叉树的遍历——先序遍历、中序遍历、后序遍历 层序遍历是指按层次的顺序从根结点向下逐层进行遍历,且对同一层的结点为从左到右遍历。需要从根结点开始从上往下逐层遍历,而对同一层进行从左到右的遍历。这个过程和BFS很像,因为BFS进行搜索总是以广度作为第一关键词,而对应到二叉树中广度又恰好体现在层次上,因此层次遍历就相当于是对二叉树从根结点开始的广度优先搜索,基本思路如下: ①将根结点ro...

分享包括但不限于计算机基础知识、数据结构与算法、Golang技术栈。年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及! 3962

二叉树按层次遍历的递归用法

对于在学数据结构的大家,在编写二叉树的按层次遍历时往往会用非递归的方法,或许有人会问可不可以用递归来做呢? 对此,小编的答案是可以的。 相对于非递归,递归稍微要复杂些(这是由于二叉树中递归左子树递归右子树是完全与层次遍历相悖的),为此需要借助其他函数来实现 下面是小编写的按层次递归遍历二叉树的代码: 小编的思路是这样的:先编写几个函数,它们的功能分别是:计算二叉树的深度(BitreeDep

YaoDeBiAn的博客 8571

二叉树的层次遍历

层次遍历 层次遍历,就是从上到下一层一层的遍历 例如: 思路: 代码实现 void BinaryTreeLevelOrder(BTNode* root) { Queue q; //树为空,直接返回 if (root == NULL) { return; } QueueInit(&amp;amp;q); ...

HanSion.Z 9万+

二叉树层次遍历:队列

二叉树层次遍历 二叉树层次遍历的基本算法在本文中不提及。本文内容为,在二叉树层次遍历中,为何选用队列这样一种数据结构。 不使用额外数据结构 首先,假设我们不使用额外的数据结构,只使用 1 个指针: 访问第一层:没有任何问题,因为 root 是已知的。 访问第二层:也没有任何问题,因为我们知道第二层所有结点的 parent。 访问第三层:问题来了,我们不知道第三层所有结点的 parent。 那该怎么办呢?访问第三层的时候一定需要知道第二层结点的位置,于是我们就想,不如把第二层结点保存起来。这样,在遍历第

Xunzhe 3036

102. 二叉树的层次遍历

队列 Queue

底层码农 6392
上一篇: 数据结构——二叉树的双序遍历
下一篇: 数据结构——二叉树的最长路径问题
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值