当前位置:网站首页>二叉树创建之层次法入门详解
二叉树创建之层次法入门详解
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、运行结果
边栏推荐
- 关于c语言的调试技巧
- DP4301无线收发SUB-1G芯片兼容CC1101智能家居
- Letter combination of LeetCode2 phone number
- 7. How to add the Click to RecyclerView and LongClick events
- Win10 Settings screen out from lack of sleep?Win10 set the method that never sleep
- Binder ServiceManager解析
- Mysql之MVCC
- General syntax and usage instructions of SQL (picture and text)
- Do Windows 10 computers need antivirus software installed?
- LORA芯片ASR6601支持M4内核的远距离传输芯片
猜你喜欢
随机推荐
5. Use RecyclerView to elegantly achieve waterfall effect
A clean start Windows 7?How to load only the basic service start Windows 7 system
ARMv8虚拟化
What should I do if I install a solid-state drive in Win10 and still have obvious lags?
SQL的通用语法和使用说明(图文)
How to solve Win11 without local users and groups
Mysql连接错误解决
Mysql lock
Spark及相关生态组件安装配置——快速回忆
FP6195耐压60V电流降压3.3V5V模块供电方案
jest测试,组件测试
Win11 keeps popping up User Account Control how to fix it
轻量化AlphaPose
【我的电赛日记(一)】HMI USART串口屏
Win10电脑不能读取U盘怎么办?不识别U盘怎么解决?
win10系统更新错误代码0x80244022怎么办
Win10安装了固态硬盘还是有明显卡顿怎么办?
实战美团Nuxt +Vue全家桶,服务端渲染,邮箱验证,passport鉴权服务,地图API引用,mongodb,redis等技术点
Binder ServiceManager解析
cmake配置libtorch报错Failed to compute shorthash for libnvrtc.so