二叉树的存储结构(链式存储)—— 数据结构与算法

news2025/1/18 7:02:57

在这里插入图片描述
请添加图片描述

😶‍🌫️Take your time ! 😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥代码仓库:🔥🔥魔王修炼之路🔥🔥
💥所属专栏:🔥魔王的修炼之路–数据结构🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。


文章目录

  • 一、前言
  • 二、二叉树的遍历
    • 前中后序
  • 三、求二叉树结点个数
  • 四、求二叉树深度
  • 五、第k层节点个数
  • 六、返回某个节点的地址
  • 七、总结

一、前言

学习完二叉树的顺序存储(堆),那么本篇博客将讲述二叉树的链式存储(左孩子右兄弟)。

  • 因为普通的二叉树增删查改没有任何意义,总不能只是因为结构复杂就用这个没有任何意义的普通二叉树来存储数据,所以我们不进行它的增删查改学习,而是先了解了解普通二叉树的一些操作:求二叉树节点个数、深度等等。

下面的所有内容都是以下图二叉树举例

在这里插入图片描述

二、二叉树的遍历

前中后序

前序:根左右
中序:左根右
后序:左右根

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct BTNode
{
	struct BTNode* left;
	struct BTNode* right;
	int data;
}BTNode;

BTNode* BuyNewnode(int x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* BTCreat()
{
	BTNode* node1 = BuyNewnode(1);
	BTNode* node2 = BuyNewnode(2);
	BTNode* node3 = BuyNewnode(4);
	BTNode* node4 = BuyNewnode(3);
	BTNode* node5 = BuyNewnode(5);
	BTNode* node6 = BuyNewnode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node4->right = node6;
	
	return node1;
}

//前序
void PreOrder(BTNode* n1)
{
	if (n1 == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%d ", n1->data);
	PreOrder(n1->left);
	PreOrder(n1->right);
}

//中序
void InOrder(BTNode* n1)
{
	if (n1 == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(n1->left);
	printf("%d ", n1->data);
	InOrder(n1->right);
}

//后序
void PostOrder(BTNode* n1)
{
	if (n1 == NULL)
	{
		printf("NULL ");
		return;
	}
	PostOrder(n1->left);
	PostOrder(n1->right);
	printf("%d ", n1->data);
}

int main()
{
	BTNode* n1 = BTCreat();

	//前序
	PreOrder(n1);
	printf("\n");
	
	//中序
	InOrder(n1);
	printf("\n");

	//后序
	PostOrder(n1);
	printf("\n");
	
	return 0;
}

三、求二叉树结点个数

递归、分治,每层只需要知道自己下一层节点的总个数即可,然后传给上一层。记得每层向上回归的时候要加上自己的那一个。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct BTNode
{
	struct BTNode* left;
	struct BTNode* right;
	int data;
}BTNode;

BTNode* BuyNewnode(int x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* BTCreat()
{
	BTNode* node1 = BuyNewnode(1);
	BTNode* node2 = BuyNewnode(2);
	BTNode* node3 = BuyNewnode(4);
	BTNode* node4 = BuyNewnode(3);
	BTNode* node5 = BuyNewnode(5);
	BTNode* node6 = BuyNewnode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node4->right = node6;
	
	return node1;
}

int BTSize(BTNode* n1)
{
	if (n1 == NULL)
		return 0;
	return BTSize(n1->left) + BTSize(n1->right) + 1;
}

int main()
{
	BTNode* n1 = BTCreat();
	//二叉树节点个数
	int size = BTSize(n1);
	printf("%d\n", size);
	return 0;
}

在这里插入图片描述

四、求二叉树深度

还是递归和分治,每层只需要直到自己左子树和右子树中最高的那个即可。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct BTNode
{
	struct BTNode* left;
	struct BTNode* right;
	int data;
}BTNode;

BTNode* BuyNewnode(int x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* BTCreat()
{
	BTNode* node1 = BuyNewnode(1);
	BTNode* node2 = BuyNewnode(2);
	BTNode* node3 = BuyNewnode(4);
	BTNode* node4 = BuyNewnode(3);
	BTNode* node5 = BuyNewnode(5);
	BTNode* node6 = BuyNewnode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node4->right = node6;
	
	return node1;
}
int BinaryTreeHeight(BTNode* n1)
{
	if (n1 == NULL)
		return 0;

	int BTLeft = BinaryTreeHeight(n1->left);
	int BTRight = BinaryTreeHeight(n1->right);

	return BTLeft > BTRight ? BTLeft + 1: BTRight + 1;
}
int main()
{
	BTNode* n1 = BTCreat();
	//二叉树深度
	int BTHeight = BinaryTreeHeight(n1);
	printf("%d\n", BTHeight);
	return 0;
}

五、第k层节点个数

举例来说:第三层是相对于第一层来说的,相对于第二层就是第二层,相对于第三层就是第一层,也就是本层。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct BTNode
{
	struct BTNode* left;
	struct BTNode* right;
	int data;
}BTNode;

BTNode* BuyNewnode(int x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* BTCreat()
{
	BTNode* node1 = BuyNewnode(1);
	BTNode* node2 = BuyNewnode(2);
	BTNode* node3 = BuyNewnode(4);
	BTNode* node4 = BuyNewnode(3);
	BTNode* node5 = BuyNewnode(5);
	BTNode* node6 = BuyNewnode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node4->right = node6;
	
	return node1;
}
int BTKLevel(BTNode* n1,int k)
{
	if (n1 == NULL)
		return 0;
	if (k == 1)
		return 1;

	return BTKLevel(n1->left,k-1) + BTKLevel(n1->right,k-1);
}
int main()
{
	BTNode* n1 = BTCreat();
	//第K层有几个节点
	int k = BTKLevel(n1,4);
	printf("%d\n", k);
	return 0;
}

六、返回某个节点的地址

首先看能否找到该节点,找到的话返回该节点的地址,找不到的话返回NULL。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct BTNode
{
	struct BTNode* left;
	struct BTNode* right;
	int data;
}BTNode;

BTNode* BuyNewnode(int x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->left = NULL;
	newnode->right = NULL;
	return newnode;
}

BTNode* BTCreat()
{
	BTNode* node1 = BuyNewnode(1);
	BTNode* node2 = BuyNewnode(2);
	BTNode* node3 = BuyNewnode(4);
	BTNode* node4 = BuyNewnode(3);
	BTNode* node5 = BuyNewnode(5);
	BTNode* node6 = BuyNewnode(6);

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node4->right = node6;
	
	return node1;
}
BTNode* BTFind(BTNode* n1,int x)
{
	if (n1 == NULL)
		return NULL;

	if (n1->data == x)
		return n1;

	BTNode* left = BTFind(n1->left,x);
	if (left)
		return left;
	BTNode* right = BTFind(n1->right,x);
	if (right)
		return right;
	return NULL;

}
int main()
{
	BTNode* n1 = BTCreat();
	//返回某个值的位置
	BTNode* p = BTFind(n1,9);
	if(p!=NULL)
		printf("%p\n", p);
	return 0;
}

七、总结

  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构初阶
😈魔王的修炼之路–C++
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进行 200 瓦太阳能 (PV) 模块设计以测量太阳能光伏阵列的电压、电流和功率、综合负荷频率和电压控制系统的方法研究(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

pycharm调整最大堆发挥最大

python程序运行时&#xff0c;怎么提高效率&#xff0c;设置pycharm最大堆过程如下&#xff1b; 一、进入设置pycharm最大堆&#xff1b; 二、进入设置pycharm最大堆&#xff1b; 如果8g设置为6g左右&#xff0c;占75%左右最佳

问题记录和细节补充

【问题记录】ORA-01400: 无法将 NULL 插入 Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID")。 原因&#xff1a;主键非自增&#xff0c;输入时并未有主键值传递&#x…

串是什么,串存储结构的3种实现方法

目录 串是什么&#xff0c;串存储结构的3种实现方法 串存储结构的具体实现 串的堆分配存储结构 串的块链存储结构 串是什么&#xff0c;串存储结构的3种实现方法 数据结构中&#xff0c;字符串要单独用一种存储结构来存储&#xff0c;称为串存储结构。这里的串指的就是字符…

判断Series序列是否含有空值NaN的Series.hasnans方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断Series序列是否含有空值NaN Series.hasnans [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd import numpy as np a pd.Series([1,np.nan],index["a","…

“想都是问题,干才是答案”是错误的,雷军说也不行

前几天&#xff0c;在为什么过去十年AI创业失败了一文中提了一个观点&#xff1a; “干就完了”式思维&#xff0c;是新式的刻舟求剑&#xff0c;剧毒&#xff0c;谁吃谁死。 没想到没过几天雷老板一个演讲又把这点炒到各个媒体的头条上&#xff0c;比如&#xff1a;“雷军20…

关于月球深层内部的谜团依然存在

地球物理数据表明&#xff0c;月球地幔的底部部分熔融或含有钛铁矿&#xff0c;但改进的流变学模型使这一层的存在受到质疑。 月球的内部结构只能使用远程地球物理数据来约束。一项新的分析表明&#xff0c;月球地幔深处的一个独特层&#xff0c;靠近深层月震发生的地方&#x…

大数据:Numpy基础应用详解

Numpy基础应用 Numpy 是一个开源的 Python 科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作&#xff0c;对于同样的数值计算任务&#xff0c;使用 NumPy 不仅代码要简洁的多&#xff0c;而且 NumPy 的性能远远优于原生 Python&#xff0c;…

小米平板6 Max 14评测:4窗口显示就是爽 多任务体验可媲美PC

一、前言&#xff1a;小米发布新款14英寸超大屏平板 专注生产力体验 加上网课、居家办公的普及&#xff0c;再加上各大手机厂商都开始搭建起自家的生态&#xff0c;尤其平板这个以往不被重视的品类&#xff0c;也开始找到了它自身的定位。 尤其在2023年上半年发布的小米平板6 P…

深入理解Vue 3.0x中的Suspense和异步组件

深入理解Vue 3.0x中的Suspense和异步组件 Vue 3.0x作为Vue.js框架的最新版本&#xff0c;引入了许多创新特性&#xff0c;其中Suspense和异步组件是重要的改进之一。在本文中&#xff0c;我们将深入探讨这两个特性&#xff0c;了解它们如何为现代Web应用带来更好的性能和用户体…

【C++11保姆级教程】final和override

文章目录 前言一、final关键字的使用1.1final关键字修饰类1.2final关键字修饰成员函数 1.3final的优势1.4final的劣势二、override关键字的使用2.1使用override关键字重写虚函数2.3override的优势 总结 前言 在C编程中&#xff0c;我们常常需要使用继承和多态来构建复杂的程序…

TTS | VocGAN声码器训练自己的数据集

哈喽&#xff0c;今天给大家介绍的是如何使用VocGAN声码器训练自己的数据集。 原文 VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network 想要论文解读&#xff0c;请参考我的这篇文章~ 本博客主要包括以下内容&#xff1a; 目录…

如何将短视频做成动态图?教你快速gif制作的方法

将产品或服务的短视频转换为gif图像后&#xff0c;可以在网站、电子邮件或社交媒体广告中使用&#xff0c;以吸引潜在客户的兴趣&#xff0c;那么怎么才能把短视频转gif图片呢&#xff1f;当然是使用专业的短视频转gif工具&#xff08;在线视频转换gif-视频转gif转换器-gif.cn_…

C语言,结构体,结构体大小,

1、结构体&#xff1a; 用于存储不同数据类型的多个相关变量&#xff0c;从而形成一个具有独立性的组合数据类型。 结构体的声明&#xff1a; struct 结构体类型名{ 数据类型 成员1&#xff1b; 数据类型 成员2&#xff1b; 数据类型 成员3&#xff1b; ……… }&#xff1…

观察级水下机器人使用系列之六超短基线(上)

观察级水下机器人使用的超短基线型号是Micro-Ranger2&#xff0c;由换能器MRT、甲板单元&#xff08;ESH&#xff09;、信标&#xff08;Nano)和计算机组成。超短基线主要用于深水&#xff08;大于100m&#xff09;&#xff0c;在浅水环境下&#xff0c;会有多径时延扩展&#…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统启动篇

相关文章 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;环境搭建篇 开发环境 Win10 64位 VS Code&#xff0c;ssh 远程连接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01&#xff08;备注&#xff1a;可以在 github 获取最新版本&#xff0…

亿赛通电子文档安全管理系统任意文件上传漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

openGauss学习笔记-41 openGauss 高级数据管理-匿名块

文章目录 openGauss学习笔记-41 openGauss 高级数据管理-匿名块41.1 语法41.2 参数说明41.3 示例 openGauss学习笔记-41 openGauss 高级数据管理-匿名块 匿名块&#xff08;Anonymous Block&#xff09;是存储过程的字块之一&#xff0c;没有名称。一般用于不频繁执行的脚本或…

【Unity每日一记】方位辨别—向量的叉乘点乘结合

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

优化 Linux 系统性能:探索 tuned 守护进程的调优配置文件

tuned守护进程调优系统调优配置文件从命令行配置系统调优安装、启用和启动tuned软件包tuned-adm 感谢 &#x1f496; hello大家好&#x1f60a; tuned守护进程调优系统 系统管理员可以基于多种用例工作负载来调整各种设备设置&#xff0c;以此优化系统性能。tuned 守护进程会利…