简单实现二叉树(链表实现)
接着上一节。我们接着学习二叉树,学习使用链表建立二叉树时,最好把每个子程序的递归展开图,都画一下
前言
在学习二叉树的基本结构前,需先要创建一颗二叉树,然后才能学习其相关的基本操作,由于现在大家二叉树的结构了解的不够深入,为了减低学习成本,这里手动快速创建一颗简单的而二叉树,快速进入二叉树操作学习,等二叉树结了解的差不多时,我们反过头来研究二叉树真正的创建方式
4. 二叉树链式结构的简单实现
4.1创建二叉树
->1.快速手搓二叉树
二叉树图示:

代码实现:
typedef int BTDataType;typedef struct BinaryTreenode
{struct BinaryTreenode* left;struct BinaryTreenode* right; BTDataType data;
}BT;BT* BuyNode(BTDataType x)
{BT* newnode = (BT*)malloc(sizeof(BT));if(NULL == newnode){perror("BuyNode::malloc");return NULL;}newnode->data = x;newnode->left = NULL;newnode->right = NULL;return newnode;
}int main()
{BT* node1 = BuyNode(1);BT* node2 = BuyNode(2);BT* node3 = BuyNode(3);BT* node4 = BuyNode(4);BT* node5 = BuyNode(5);BT* node6 = BuyNode(6);BT* node7 = BuyNode(7);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return 0;
}
创建七个结点使用前六个组成一个二叉树,留一个备用
->2.二叉树的前序,中序,后序遍历
前序:根节点->左子树->右子树
代码实现:
//前序
void PrevOrder(BT* root)
{if (NULL == root){printf("NULL ");return;}printf("%d ", root->data);PrevOrder(root->left);PrevOrder(root->right);
}
前序递归展开图:只要有节点它就一定有子节点例如3,他就需要遍历它的两颗空树(NULL),大家可以画一下递归展开图,利于我们理解递归

前序大致的顺序:1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL
测试:

中序:左子树->根节点->右子树
代码实现:
//中续
void InOrder(BT* root)
{if (NULL == root){printf("NULL ");return;}InOrder(root->left);printf("%d ", root->data);InOrder(root->right);
}
中序递归展开图:

中序顺序:NULL NULL 3 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL
测试:

后序:左子树->右子树->根
代码实现:
void PostOrder(BT* root)
{if(NULL == root){printf("NULL");return;}PostOrder(root->left);PostOrder(root->right);printf("%d\n", root->data);
}
后续递归展开图:

后序顺序:NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1
测试:

->3.二叉树节点个数
代码实现:
//求二叉树所有节点方法一:
int size = 0; //全局变量
int TreeSize(BT* root)
{//使用静态变量//static int size = 0; 不行!因为初始化一次之后就不能在初始化了,会造成累加if (NULL == root){return;}++size;TreeSize(root->left);TreeSize(root->right);return size;
}方法二:
int TreeSize1(BT* root, int* Size1)
{if (NULL == root){return;}++(*Size1);TreeSize1(root->left, Size1);TreeSize1(root->right, Size1);return *Size1;
}// 方法三 对比以上面两个代码,大大的减少了代码量,使用起来更有效率
int TreeSize3(BT* root)
{return root == NULL ? 0 :TreeSize3(root->left) + TreeSize3(root->right) + 1;
}
方法三递归展开图:

总节点为: 6
测试:

->4.二叉树的高度/深度
代码实现:
int BinaryTreeHeight(BT* root)
{if(root == NULL){return 0;}int lHeight = BinaryTreeHeight(root->lrft);int rHeight = BinaryTreeHeight(root->right);return lHeight > rHeight ? lHeight + 1 : rHeight + 1;
}
递归展开图:

这张图只标记了左子树的递归展开,右子树也是一样的,最后左子树和右子树深度相比将大那个加1输出就可以了
测试:

->5.求二叉树k层的个数
代码实现:
//求k层的个数
int TreeLevelK(BT* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}int leftk = TreeLevelK(root->left, k - 1);int right = TreeLevelK(root->right, k - 1);return leftk + right;
}
递归展开图:
求二叉树第三层的节点个数

测试:

->6.二叉树查找值为x的节点
代码实现:
//二叉树查找值为x的结点
BT* BinaryTreeFind(BT* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;BT* lret = BinaryTreeFind(root->left, x);if (lret)return lret;BT* rret = BinaryTreeFind(root->right, x);if (rret)return rret;return NULL;
}
递归展开图:

测试:

->7.层序遍历
层序遍历是使用队列实现的,这里没有使用递归,这里看我上几节写的队列
将链表的成员换为二叉树的节点,用来存储二叉树的节点,然后利用队列的性质,将二叉树的值层序输出就可以了

//层序遍历
void LevelOrder(BT* root)
{Queue q;QueueInit(&q);if(root)QueuePush(&q, root);printf("LevelOrder: ");while (!QueueEmpty(&q)){BT* front = QueueFront(&q);QueuePop(&q);printf("%d ", front->data);if (front->left)QueuePush(&q, front->left);if (front->right)QueuePush(&q, front->right);}QueueDestroy(&q);
}
测试:

相关文章:
简单实现二叉树(链表实现)
接着上一节。我们接着学习二叉树,学习使用链表建立二叉树时,最好把每个子程序的递归展开图,都画一下 前言 在学习二叉树的基本结构前,需先要创建一颗二叉树,然后才能学习其相关的基本操作,由于现在大家二…...
搭建 Web 群集Haproxy
案例概述 Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如 LVS 和Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的upstream模块支持群集功能,但是对群集节点健康检查功能不强…...
PDF隐写思路
文章目录 使用工具技术细节小结 使用工具 工具:WPS、010Editor、WbStego 技术细节 步骤: 使用 WPS 查看文件,看是否能打开。 若不能打开则使用 010Editor 查看是否少了头文件等。 正常的 PDF 缺少头文件的 PDF 如果缺少头文件则使用 010…...
Pycharm 常用快捷键
快捷键作用描述Ctrl Space基本的代码自动完成Ctrl Shift Space选择代码自动完成Ctrl D复制当前行或符号Ctrl X剪切当前行或符号Ctrl C复制当前行或符号Ctrl V粘贴剪贴板内容Ctrl Y删除当前行Ctrl A全选当前文件内容Ctrl Z撤销操作Ctrl Shift Z重做操作Ctrl F查找文…...
android音频录音,(一)MediaRecorder简介
1.MediaRecorder概述 Android 多媒体框架支持捕获和编码各种常见的音频和视频格式,简要介绍音频录音。 2.MediaRecorder 源码路径:frameworks/base/media/java/android/media/MediaRecorder.java 源码接口: setAudioSource(MediaRecorde…...
autoX.js
一. 概述 AutoX.js 使用 JavaScript 作为脚本语言,目前使用 Rhino 1.7.13 作为脚本引擎,支持 ES5 与部分 ES6 特性。 下载地址: https://github.com/kkevsekk1/AutoX/releases 官方文档: AutoX.js 二. 用法 1. 首先在官网下…...
日本软文发稿:日本主流发稿媒体有哪些?
日本软文发稿:日本主流发稿媒体有哪些 在日本发布软文时,选择合适的主流媒体进行推广是非常关键的。以下是一些在日本广受欢迎、影响力较大的媒体推荐(排列不区分媒体排名顺序): 1. 朝日新闻 (Asahi Shimbun) 朝日新…...
翰德恩赋能中国邮政信息科技产品创新系列培训
为了增强中邮信科公司需求分析工程师的专业素养,提升其业务需求和业务价值的挖掘能力,进而设计并交付满足用户期望的产品,提升用户体验,运营管理部于2024年4月至6月成功举办了六期需求分析工程师能力提升系列培训。 本次系列培训…...
分享一个基于SpringBoot的英语学习平台Java英语学习任务打卡系统(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
Golang学习笔记
Go 语言学习笔记 1. 引言 Go 语言是由 Google 开发的一种静态类型、编译型的系统编程语言。它以简洁、高效和易于理解著称,并且支持并发编程。 2. 安装与环境配置 2.1 安装 Go 访问 Go 官方网站 下载适合你操作系统的安装包。安装完成后,设置 GOPAT…...
详解【多线程与并发】之线程
目录 1、线程 1.1线程Thread 1.2线程特点 1.3线程函数的原型 1.4Linux对于pthread的API的支持 1.4.1创建一个线程 1.4.2线程的退出 1.5资源分离 2、线程的同步/互斥机制 2.1线程互斥锁 2.1.1初始化线程互斥锁 2.2线程互斥锁的PV 操作 2.2.1P 操作(上锁…...
Linux安全与高级应用(四)深入探索MySQL数据库:安装、管理与安全实践
文章目录 标题:全面解析LAMP平台部署及应用第一部分:LAMP平台概述第二部分:准备工作第三部分:安装和配置PHP第四部分:配置Apache第五部分:测试LAMP平台第六部分:部署phpMyAdmin总结 ὄ…...
「iOS」自定义Modal转场——抽屉视图的实现
「iOS」自定义Modal转场——抽屉视图的实现 文章目录 「iOS」自定义Modal转场——抽屉视图的实现前言错误尝试自定义Modal转场实现流程自定义动画类UIPresentationController 成果展示参考文章 前言 在仿写网易云的过程之中,看到学长之前仿写时实现的抽屉视图&…...
【数据结构】顺序结构实现:特殊完全二叉树(堆)+堆排序
二叉树 一.二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆的结构2.堆的初始化、销毁、打印、判空3.堆中的值交换4.堆顶元素5.堆向上调整算法:实现小堆的插入6.堆向下调整算法:实现小堆的删除7.堆的创建1.堆向上调整算法:建堆建堆的时间复…...
【c++学习技术栈】
c学习技术栈 基础c基础组件中间件框架devops性能目标岗位 基础 计算机网络数据结构与算法操作系统linux c 基础组件 池式组件:线程池,内存池,db数据库连接池原子,无锁队列,ringbuffer,定时器。日志&…...
swift 自定义DatePacker
import Foundationenum AppDatePickerStyle {case KDatePickerDate //年月日case KDatePickerTime //年月日时分case kDatePickerMonth // 年月case KDatePickerSecond //秒}class AppDatePicker: UIView {private let jk_rootView UIApplication.shared.keyWindow!pri…...
MySQL事务,锁,MVCC总结
mysql中最重要的就是事务,其四大特性让我们维持了数据的平衡,一致。那么事务究竟是什么,与什么相关,他的使用步骤,以及使用过程中我们会遇到什么问题呢?下面我们一起学习交流! 1.MySQL的存储引擎ÿ…...
24/8/7 算法笔记 支持向量机回归问题天猫双十一
import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…...
win7系统利用定时启动+脚本实现MySQL文件自动备份
前言 最近接到项目,数据量不大但对运行数据的安全性要求极高,为避免因不可抗拒因素导致的数据丢失,选择机械硬盘作为数据存储盘,并使用脚本方式对文件进行备份 一、脚本 下面为自动备份文件的 脚本,可根据自身情况进…...
基于Java多线程处理数据
基于Java多线程处理数据 背景代码实现 背景 在日常工作中,有一个同步企微客户-学员关系接口的定时任务在执行中随着数据量的不断增长,定时任务的执行结束时间也出现了当天执行不完的情况,影响到了正常业务的运行。基于这种情况,在…...
贾子科学定理(Kucius Science Theorem):重构科学本质——公理驱动与结构化范式的确立
贾子科学定理(Kucius Science Theorem):重构科学本质——公理驱动与结构化范式的确立摘要: 贾子科学定理颠覆传统“可证伪性”标准,提出科学本质为“公理驱动可结构化”,构建TMM三层体系(真理层…...
Leaflet 结合 leaflet-velocity 实现动态风场可视化的实战指南
1. 从零开始搭建风场可视化环境 第一次接触风场可视化时,我被那些动态流动的粒子效果深深吸引。作为Web地图开发中最酷炫的效果之一,用Leaflet实现风场展示其实比你想象的简单得多。我们先从最基础的环境搭建说起。 我推荐使用VSCode作为开发工具&#x…...
MPI-3.x,4.x,5.x新增核心功能
文章目录MPI-3.x,4.x,5.x新增核心功能一、MPI 3.x 系列(现代MPI的基石)MPI 3.0(2012)——革命性升级MPI 3.1(2015)——小幅增强二、MPI 4.x 系列(超大问题 下一代架构)MPI 4.0&…...
STM32开发中printf重定向的两种实现方法
1. STM32开发中的printf重定向需求解析在嵌入式开发中,调试信息的输出是开发过程中不可或缺的一环。对于STM32这类ARM Cortex-M系列微控制器而言,标准库中的printf函数默认是无法直接使用的,因为这类设备通常没有像PC那样的标准输出设备。这就…...
OpenClaw性能调优:Qwen3-14B镜像响应速度提升3倍实操
OpenClaw性能调优:Qwen3-14B镜像响应速度提升3倍实操 1. 为什么需要性能调优? 上周我在用OpenClaw自动处理100份PDF文档时,发现一个奇怪现象:同样的任务,晚上执行比白天快得多。经过排查才发现,白天我的本…...
2026届学术党必备的降AI率平台横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 降低那个AIGC率的关键要点在于削弱机器生成所呈现出的模式化特性。其一,对句式结…...
数据治理与数据质量:从策略到实践
数据治理与数据质量:从策略到实践 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据治理和数据质量在企业数据管理中的重要性。随着数据量的爆炸式增长和数据类型的多样化,数据治理和数据质量已经成为企业数据管理的核心挑战。今…...
**发散创新:基于Python的本体推理与知识表示实战解析**在人工智能和语义网技术飞速发展的今天,**知识表
发散创新:基于Python的本体推理与知识表示实战解析 在人工智能和语义网技术飞速发展的今天,知识表示(Knowledge Representation) 已成为构建智能系统的底层核心能力之一。它不仅决定了系统对现实世界的理解深度,还直接…...
比话降AI实测:AI率87%的论文降到11%全程记录
这篇是比话降AI的真实使用记录,不是广告软文,是我帮朋友处理论文的完整过程。 朋友的情况:研究生论文,4.2万字,知网AIGC检测87%,距离提交截止7天。 为什么选比话降AI 比话降AI(www.bihuapass…...
第7章 Mosquitto增加SSL/TLS加密通信
第7章 SSL/TLS加密通信 7.1 TLS基础 #mermaid-svg-GnHmiOrEfRuPOevS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mer…...
