当前位置:网站首页>二叉树创建之层次法入门详解
二叉树创建之层次法入门详解
2022-08-02 14:10:00 【杨老头软工】
一、引言
前面已经给出了先序法创建二叉树的两种方法,分别是非递归的方法和递归方法,本文将给出了C语言版本的层次法创建二叉树的算法。所谓的层次法其实就是按照二叉树中结点所在的“层”进行遍历,每一层遍历的规则是从左到右。因此层次遍历其实就是按照完全二叉树中结点的编号次序进行遍历的,但是二叉树不一定都是完全二叉树,因此涉及到虚拟的补充成完全二叉树,然后再进行层次遍历。
所使用的示例二叉树如下图所示。
二、二叉树的创建-层次法
1、结点编号规则
层次法创建二叉树,仍旧需要把扩充二叉树。但是此处不同于先序法的扩充的是,需要按照完全二叉树的模式扩充结点。补齐这些结点的目的是为了记录完全二叉树的结点编号而已,因此事实上并不需要真的补齐缺的结点,只需要记住二叉树上所有的结点在完全二叉树上结点的编号即可。
此时,图(1)中结点的编号如下(从1开始):
2、算法的基本思路:
首先创建一个数组S,用于存储二叉树上全部的结点。
之后开始依次读入结点数据,具体做法是一次同时读入某个结点的编号i和数据data,以此创建结点,并把该结点放到数组S的下标为i的位置。接着根据i/2来确定其双亲在S中的下标,且根据i是否被2整除来确定结点i是j的左子树还是右子树。
3、算法的具体实现:
#include"stdio.h"
#include"malloc.h"
#define CHAR
#define MAX_NODE 100
#ifdef CHAR
typedef char datatype;
#else
typedef int datatype;
#endif
typedef struct node
{
datatype data;
struct node *Lchild;
struct node *Rchild;
}BiTree;
BiTree *CreateBiTreeLevel( void )
{
BiTree *T, *p, *s[MAX_NODE];
datatype data;
int i, j;
T = NULL;
while ( 1 )
{
printf( " 输入结点编号( 0 则终止输入 ): " );
scanf( "%d", &i );
if( i == 0 )
break;
else
{
#ifdef CHAR
getchar();//过滤输入结点编号后面的换行符
printf( " 请输入结点数据(字符):" );
scanf( "%c",&data );
getchar();//过滤结点数据后面的换行符
#else
printf( " 请输入结点数据(整数):" );
scanf( "%d",&data );
#endif
//创建结点,并把data存入该结点,同时把该结点的左右子树置空
p = ( BiTree * )malloc( sizeof(BiTree) ) ;
p->data = data ;
p->Lchild = NULL;
p->Rchild = NULL;
s[i] = p ;
if( i == 1 ) //编号为1的结点是树根
T = p ;
else//找新加入结点的双亲
{
j = i / 2; // j是i的双亲结点编号
if( i % 2 == 0 )
{
s[j]->Lchild = p;//左子树
//下面的输出是为了检验结点的位置是否跟预期相符。
#ifdef CHAR
printf( " %c 是 %c 的左子树\n", p->data, s[j]->data );
#else
printf( " %d 是 %d 的左子树\n", p->data, s[j]->data );
#endif
}
else
{
s[j]->Rchild = p;//右子树
#ifdef CHAR
printf( " %c 是 %c 的右子树\n", p->data, s[j]->data );
#else
printf( " %d 是 %d 的右子树\n", p->data, s[j]->data );
#endif
}
}
}
}
return( T );
}
int main()
{
BiTree *T = CreateBiTreeLevel( );
return 0;
}
4、运行结果
边栏推荐
- Configure clangd for vscode
- How to set the win10 taskbar does not merge icons
- How to solve Win11 without local users and groups
- 基于最小二乘法的线性回归分析方程中系数的估计
- win10任务栏不合并图标如何设置
- 日常-笔记
- pygame拖动条的实现方法
- 刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
- 【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
- 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)
猜你喜欢
【使用Pytorch实现ResNet网络模型:ResNet50、ResNet101和ResNet152】
FP5139电池与适配器供电DC-DC隔离升降压电路反激电路电荷泵电路原理图
FP7122降压恒流内置MOS耐压100V共正极阳极PWM调光方案原理图
Mysql lock
A clean start Windows 7?How to load only the basic service start Windows 7 system
STM32LL库——USART中断接收不定长信息
Win11没有本地用户和组怎么解决
Configure clangd for vscode
Use tencent cloud builds a personal blog
Binder机制(中篇)
随机推荐
The SSE instructions into ARM NEON
PHY6222蓝牙5.2支持MESH组网M0内核超低功耗
C语言函数参数传递模式入门详解
总结计算机网络超全面试题
[STM32 Learning 1] Basic knowledge and concepts are clear
DP4056电源保护芯片锂电池pin对pinTP4056
Win11 system cannot find dll file how to fix
发布模块到npm应该怎么操作?及错误问题解决方案
Mysql连接错误解决
HAL框架
DP1332E刷卡芯片支持NFC内置mcu智能楼宇/终端poss机/智能门锁
Win10系统设置application identity自动提示拒绝访问怎么办
FP7195转模拟调光技术解决智能家居调光频闪和电感噪音的原理
Failed to install using npx -p @storybook/cli sb init, build a dedicated storybook by hand
TypeScript 快速进阶
Please make sure you have the correct access rights and the repository exists.问题解决
LORA芯片ASR6601支持M4内核的远距离传输芯片
利用plot_surface命令绘制复杂曲面入门详解
日常-笔记
用U盘怎么重装Win7系统?如何使用u盘重装系统win7?