数组数据构建二叉树

1、数组数据说明

数组中的数据是按照二叉树的层次存放的,位置上没有数据的放NULL.

比如:

int a[] = {5,1,4,NULL,NULL,3,6};

2、数组数据构建二叉树

2.1、构建节点

如上图,节点需要一个结构体指针成员指向左孩子

          一个结构体指针成员指向右孩子

          一个成员存储数据

typedef struct node
{
	struct node *lchild;   // 指向左孩子指针
	int data;            // 存储数据
	struct node *rchild;   // 指向右孩子指针
}NODE;

2.2、生成链表

1、获取数组中数据构造的二叉树的层次

每个节点最多有两颗子树的树称为 二叉树。

数组中的数据按照1生2,2生4......的规则构造二叉树

数组元素总个数 <= 2^0+2^1+2^2+......2^n = 2^(n+1)-1

所以,二叉树的层次 = 向下取整( log2(数组元素总个数) )

2、构造链表

按照上一步求出的层次,生成新节点放置数组中的数据。

由上图可以看出此二叉树和对应的一维数组中的索引值有以下关系:

        1、左子树的索引值是父节点的索引值乘2。

        2、右子树的索引值是父节点的索引值乘2加1。

注意:

        为了方便使用索引是从1开始的,但是数组下标要从0开始。

        已知索引求当前索引对应数据在二叉树的第几层: 向下取整( log2(索引) )即可。

思路:
  
 节点地址 转换函数(数组,索引,长度)
    {
        获取二叉树的层次
        获取当前索引 在第几层
        
        如果索引对应数组数据 == NULL 或者 索引 > 长度
        {
            返回 NULL 结束
        }        
        否则
        {
            创建节点
            将索引对应的数组数据写入节点data中
            
            如果 当前是最后一层节点
            {
                将节点的左右孩子设置为NULL
            }
            否则
            {
                // 添加下一级左右孩子
                节点->lchild = 转换函数(数组,2*索引,长度);
                节点->rchild = 转换函数(数组,2*索引+1,长度);
            }
            
            最后返回节点地址
        }        
    }

代码:

        

// 根据数组生成链表并将头结点的地址返回 
NODE *makeLink(int arr[],int idx,int size)
{	
    // 二叉树的层次
	static int fNum;   
	fNum = bBinaryTreeFloor(size);	
	
	// 根据下标求当前节点在第几层 -- 对数 
	int nfloor = (int)floor(log2(idx));  
	
	// 如果数组元素值为NULL或者节点在数组中没有 左孩子或者右孩子了 
	if(arr[idx-1] == NULL || idx > size)
	{
		return NULL;
	}
	
	// 创建节点
	NODE *p = (NODE *)malloc(sizeof(NODE));
	// 添加节点数据 
	p->data = arr[idx-1];	
	 
	if(nfloor == fNum - 1) 
	{		
		// 如果是最后一层的节点即叶子节点则左右孩子指针为NULL 
		p->lchild = NULL;
		p->rchild = NULL; 
	} 
	else
	{		
		// 继续向下添加左孩子 
		p->lchild = makeLink(arr,2*idx,size);		
		// 继续向下添加右孩子 
		p->rchild = makeLink(arr,2*idx+1,size); 		
	}		
	
	// 将节点地址返回给它父亲的左右指针 
	return p;
}

3、遍历二叉树验证

二叉树的编译可以参考:二叉树遍历C语言实现

本例使用后序遍历进行检测构造的链表是否完好。

int main()
{
	NODE *root = NULL;
	// int a[] = {2,1,3};
	int a[] = {5,1,4,NULL,NULL,3,6};
	int len = sizeof(a) / sizeof(int);	
	
	root = makeLink(a,1,len);	
	postOrder(root);
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/529653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Softing WireXpert 4500线缆认证仪的独特之处——双控系统

Softing推出的WireXpert 4500线缆认证仪&#xff0c;可用于结构化布线认证&#xff0c;认证速率高达40Gb/s。该线缆认证仪专为实用性而设计&#xff0c;重量轻&#xff0c;手感舒适&#xff0c;主机与副机均配备6英寸工业LCD触摸屏&#xff0c;使其更适用于布线现场。 WireXper…

数字图像处理与交叉学科中名词的拧巴

特征提取 图像处理——对图像、目标或特征点进行定量描述的方法及过程。 模式识别——对原特征进行特征变换&#xff0c;从高维空间到低维空间映射。 特征向量 模式识别、图像处理——一个观测包括多个变量&#xff0c;样本的多个特征组成特征向量。 线性代数——特征值对应的…

spikingjelly学习-训练网络

【MNIST数据集包含若干尺寸为28*28的8位灰度图像&#xff0c;总共有0~9共10个类别。以MNIST的分类为例&#xff0c;一个简单的单层ANN网络如下 我们也可以用完全类似结构的SNN来进行分类任务。就这个网络而言&#xff0c;只需要先去掉所有的激活函数&#xff0c;再将尖峰神经元…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了&#xff0c;我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了&#xff0c;我当初写CSDN的目的就是为了找工作&#xff0c;有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

SpringBoot通用模块--文件上传开发(阿里云OSS)

文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件上传服务&#xff0c;需要有存储的支持&#xff0c;那…

lora微调过程

import os import pickle from transformers import AutoModelForCausalLM from peft import get_peft_config, get_peft_model, get_peft_model_state_dict, LoraConfig, TaskTypedevice "cuda:0"#1.创建lora微调基本的配置 peft_config LoraConfig(task_typeTask…

记一次SQL优化

问题描述&#xff1a; 原本执行此查询&#xff0c;需要占用546G内存数据&#xff0c; 但经过与实施人员沟通&#xff0c;以及对于业务的排查 &#xff08;精简SQL&#xff0c;站在业务的角度优化SQL&#xff09; 去掉排序功能&#xff08;运维&#xff0c;及生产人员可接受&am…

HarmonyOS 开发-应用异常处理案例

介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法&#xff0c;主要分为应用崩溃、应用卡死以及系统查杀三种。 效果图预览 使用说明&#xff1a; 点击构建应用崩溃事件&#xff0c;3s之后应用退出&#xff0c;然后打开应用进入应用异常页面&#x…

Maven与Jave web结构

Maven 简介 https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200 java web module web目录 –src 应用程序源代码和测试程序代码的根目录 –main –java  应用程序源代码目录     --package1     --class1     --class2 –resources  应用…

P8707 [蓝桥杯 2020 省 AB1] 走方格

原题链接&#xff1a;[蓝桥杯 2020 省 AB1] 走方格 - 洛谷 目录 1.题目描述 2.思路分析 3.代码实现 1.题目描述 2.思路分析 题目大意&#xff1a;现在有个人站在第 1 行第 1 列&#xff0c;要走到第 i 行第 j 列&#xff08;每次只能向右或者向下走&#xff09;&#xff0…

Linux操作系统(六):文件系统组件

参考资料&#xff1a;阿秀的笔记 文件系统 1. 文件系统的基本组成2. 文件的使用3.文件如何存储3.1 目录怎么存储 4.Linux继承于Unix系统的Unix文件实现方式4.1 Linux Ext 2/3 文件系统4.2 Linux Ext 4 文件系统4.3 磁盘空闲空间的管理机制4.3.1 空闲表法4.3.2 空闲链表法4.3.3…

js语法---简单理解promise

promise语法结构 创建一个promise对象 let p new Promise(function(resolve,reject){// 执行的操作...// 判断操作的结果并执行对应的回调函数if(){resolve()}else{reject()} } 以上实例化了一个promise对象&#xff0c;其中包含了一个参数function&#xff0c;这个函数会在…

从二维数组到一维数组——探索01背包问题的动态规划优化

文章目录 题目前知背包问题 二维dp数组一、思路二、解题方法三、Code 一维dp数组一、思路二、解题方法三、Code 总结 本文将继续上一篇博客爬楼梯之后继续讲解同样用到了动态规划的 01背包问题 在解决动态规划问题时&#xff0c;我们经常面临着空间复杂度的挑战。01背包问题是…

书生·浦语大模型-第三节课笔记/作业

笔记 作业 原版 prompt控制节奏&#xff0c;实现类似关键词检索、主题、信息抽取等功能注意这里根据llm返回的topic (prompt: 告诉我这句话的主题&#xff0c;直接说主题不要解释)进行召回检索(CacheRetriever), 并再次让大模型判断query与返回的检索的相关程度. 如果本地检索…

【工具-工具指南】

项目-开发工具 ■ 编辑器■ Xmind ■ UI交互设计■ AxureRP9 ■ 项目管理■ boardmix■ excalidraw ■ Markdown■ MarkText■ Typora■ Ulysses■ Notable■ VNote■ Mou■ Bears■ Notion■ 有道云■ 印象笔记 ■ 硬件画图■ AD■ Allegro■ PADS■ Eagle■ Altium■ Fritzin…

保研线性代数复习4

一.范数&#xff08;Norms&#xff09; 1.什么是范数&#xff1f; 范数是一个向量空间V的函数&#xff0c;每一个属于向量空间V的向量x都匹配了一个实数&#xff08;它的长度&#xff09;&#xff1a; 2.范数的性质&#xff1f; 齐次性&#xff1a; 正定性&#xff1a; 三…

SpringBoot整合MyBatis四种常用的分页方式

目录 方式1 一、准备工作 1. 创建表结构 2. 导入表数据 3. 导入pom.xml依赖 4. 配置application.yml文件 5. 创建公用的实体类 项目结构 2. 创建controller层 3. 创建service层 4. 创建mapper层 5. 创建xml文件 6. 使用postman进行测试&#xff0c;测试结果如下…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

学习记录14-运算放大器2

目录 前言 一、理想放大器 二、虚断 二、虚短 虚短的两个使用条件 1.虚短概念 2.如果我们将运放的同相端和反相端颠倒会怎样呢&#xff1f; 总结 前言 主要讲述运算放大器的虚短虚断 一、理想放大器 如果没有基础或只是想简单了解&#xff0c;可以看我前一篇文章&am…

数学基础:常见函数图像

来自&#xff1a; https://www.desmos.com/calculator/l3u8133jwj?langzh-CN 推荐: https://www.shuxuele.com/index.html 一、三角函数 1.1 正弦 sin(x) 1.2 余弦 cos(x) 1.3 正切 tan(x) 1.4 余切 cot(x) 1.5 正弦余弦综合 1.6 正切余切综合 二、指数对数