当前位置: 首页 > news >正文

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章,那么闲话少叙,我们直接进入正题

在讲二叉树的一些之前知识点之前,我先给大家送个小礼物哈

手搓二叉树

typedef int BTDataType ;
typedef struct BinaryTreeNode
{
BTDataType _data ;
struct BinaryTreeNode * _left ;
struct BinaryTreeNode * _right ;
} BTNode ;
BTNode * CreatBinaryTree ()
{
BTNode * node1 = BuyNode ( 1 );
BTNode * node2 = BuyNode ( 2 );
BTNode * node3 = BuyNode ( 3 );
BTNode * node4 = BuyNode ( 4 );
BTNode * node5 = BuyNode ( 5 );
BTNode * node6 = BuyNode ( 6 );
node1 -> _left = node2 ;
node1 -> _right = node4 ;
node2 -> _left = node3 ;
node4 -> _left = node5 ;
node4 -> _right = node6 ;
return node1 ;
}

手搓二叉树的思路

首先创建一个结构体,且结构体里的元素也是需要自己设置,就拿链表来举例,结构体内必须包含数据以及指向下一个节点的指针next,那么返回到二叉树这里,结构体需要包含的就是数据,以及左右指针,然后创建子节点以及子节点之间相互连接

前序遍历

那么我们可以先从这个图中得到一个结论

前序遍历:根  左子树   右子树

这里我也是给大家准备了一个小视频,大家可以参考一下

二叉树前序遍历思路讲解

源代码

void FrontOrder(TFT* node)
{
    if (node == NULL)
    {
        printf("N ");
        return;
    }
    printf("%d ", node->data);
    FrontOrder(node->left);
    FrontOrder(node->right);
}

中序遍历

我们先来说一下结论

中序遍历:左子树    根     右子树

这里的操作我也给大家准备了 一个小视频,大家可以参考一下

二叉树中序遍历思路讲解

源代码

void MiddleOrder(TFT* node)
{
    if (node == NULL)
    {
        printf("N ");
        return;
    }
    MiddleOrder(node->left);
    printf("%d ", node->data);
    MiddleOrder(node->right);
}

后序遍历

还是一样,我们先讲结论

后序遍历:左子树   右子树   根

这里的操作我也给大家准备了 一个小视频,大家可以参考一下

二叉树的后序遍历

源代码

void BehindOrder(TFT* node)
{
    if (node == NULL)
    {
        printf("N ");
        return;
    }
    BehindOrder(node->left);
    BehindOrder(node->right);
    printf("%d ", node->data);
}

前中后序的共同特点

通过递归的方法,进行遍历

节点计数

思路:当节点不为空时,计数器+1,节点为空时,计数器+0,然后用递归进行遍历

源代码

int TreeSize(TFT* root)
{
    /*int size = 0;*/
    if (root == NULL)
        return 0;
    else
        ++size;

    TreeSize(root->left);
    TreeSize(root->right);
    return size;
}

计算树的高度

思路:进入函数后先判空,如果为空,则返回0,不为空时,先记录当前左右两科树的高点,然后进行左右判断,谁大谁加1

源代码

int TreeHighSize(TFT* node)
{
    if (node == NULL)
        return 0;
    int left = TreeHighSize(node->left);
    int right = TreeHighSize(node->right);
    return left > right ? left + 1 : right + 1;
}

树的销毁

树的销毁其实不难,基本上就是还原变量指针等等

源代码

void DestroyTree(TFT* node)
{
    if (node == NULL)
        return;
    DestroyTree(node->left);
    DestroyTree(node->right);
    free(node);
}

那么初阶数据结构系列的文章就先给大家更新到这里,如果喜欢我的文章,还请各位观众老爷们留个赞谢谢,我们下期再见

相关文章:

初阶数据结构之二叉树

那么本篇文是初阶数据结构这个系列的最后一篇文章,那么闲话少叙,我们直接进入正题 在讲二叉树的一些之前知识点之前,我先给大家送个小礼物哈 手搓二叉树 typedef int BTDataType ; typedef struct BinaryTreeNode { BTDataType _data …...

代码随想三刷动态规划篇8

代码随想三刷动态规划篇8 122. 买卖股票的最佳时机 II题目代码 123. 买卖股票的最佳时机 III题目代码 188. 买卖股票的最佳时机 IV题目代码 309. 买卖股票的最佳时机含冷冻期题目代码 122. 买卖股票的最佳时机 II 题目 链接 代码 class Solution {public int maxProfit(int…...

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…...

离线安装docker社区版

提示:以下所有命令都在Ubuntu-24.04-live-server-amd64系统中运行 文章目录 前言一、离线包制作二、在目标系统上离线安装Docker CE总结 前言 安全原因,内部机器不能联网,要给新机器安装 docker-ce 只能使用离线安装方法。如果使用本文的下载…...

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…...

【TB作品】矩阵键盘电话拨号,ATMEGA16单片机,Proteus仿真 atmega16矩阵键盘电话拨号

atmega16矩阵键盘电话拨号 c代码和仿真图&#xff1a; 使用ATmega16实现矩阵键盘电话拨号功能 项目背景 在电子设计和嵌入式系统开发中&#xff0c;矩阵键盘是常见的人机交互方式。它可以实现较多按键的输入&#xff0c;同时节省单片机的I/O资源。结合LCD显示和蜂鸣器&am…...

JavaScript(6)——数据类型转换

为什么需要类型转换&#xff1f; JavaScript是弱数据类型&#xff1a;JavaScript不知道变量到底属于哪种数据类型&#xff0c;只有赋值了才清除 使用表单&#xff0c;prompt获取的数据默认为字符串类型&#xff0c;此时不能直接进行算数运算 隐式转换 某些运算符被执行时&am…...

概率论与数理统计_下_科学出版社

contents 前言第5章 大数定律与中心极限定理独立同分布中心极限定理 第6章 数理统计的基本概念6.1 总体与样本6.2 经验分布与频率直方图6.3 统计量6.4 正态总体抽样分布定理6.4.1 卡方分布、t 分布、F 分布6.4.2 正态总体抽样分布基本定理 第7章 参数估计7.1 点估计7.1.1 矩估计…...

Android 复习layer-list使用

<shape android:shape"rectangle"> <size android:width"1dp" android:height"100px" /> <solid android:color"#FFFFFF" /> </shape> 通过shape画线段,通过 <item android:gravity"left|top"…...

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理

基本参数&#xff1a; 机器型号&#xff1a;HGLM2200N 产品名称&#xff1a;A4黑白激光多功能一体机 基础功能&#xff1a;打印、扫描、复印 打印速度&#xff1a;22页/分钟 纸张输入容量&#xff1a;150-249页 单面支持纸张尺寸&#xff1a;A4、A5、A6 产品尺寸&#x…...

引领汽车软件开发走向ASPICE认证之路

亚远景科技与ASPICE认证的关系可以从以下几个方面来阐述&#xff1a; (要明确的是&#xff1a;在ASPICE行业中专业来说&#xff0c;ASPICE项目是没有认证&#xff0c;而只有评估。不过&#xff0c;为了方便沟通&#xff0c;人们常将这一评估过程称为认证。&#xff09; 行业专…...

【C/C++ new/delete和malloc/free的异同及原理】

new/delete和malloc/free都是用于在C&#xff08;以及C语言在malloc/free的情况下&#xff09;中动态申请和释放内存的机制&#xff0c;但它们之间存在一些显著的异同点。以下是对这两组函数/运算符的异同点的详细分析&#xff1a; 相同点 目的相同&#xff1a;两者都用于在堆…...

Maven Archetype 自定义项目模板:高效开发的最佳实践

文章目录 前言一、Maven Archetype二、创建自定义 Maven Archetype三、定制 Archetype 模板四、手动创建 Archetype 模板项目五、FAQ5.1 如何删除自定义的模板5.2 是否可以在模板中使用空文件夹 六、小结推荐阅读 前言 在软件开发中&#xff0c;标准化和快速初始化项目结构能够…...

vue的ESLint 4格缩进 笔记

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一&#xff0c;代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…...

【前端项目笔记】8 订单管理

订单管理 效果展示&#xff1a; 在开发功能之前先创建分支order cls 清屏 git branch 查看所有分支&#xff08;*代表当前分支&#xff09; git checkout -b order 新建分支order git push -u origin order 将本地的当前分支提交到云端仓库origin中命名为order 通过路由方式…...

构建Yarn依赖树:深入解析与实践指南

构建Yarn依赖树&#xff1a;深入解析与实践指南 在现代JavaScript开发中&#xff0c;依赖管理是项目成功的关键。Yarn&#xff0c;作为Node.js生态系统中一个强大的包管理器&#xff0c;以其快速、可靠和安全的特性而闻名。本文将深入探讨Yarn如何构建依赖树&#xff0c;并提供…...

社区活动|FlowUs知识库的发展|先进技术的落地应用|下一代生产力工具你用了吗

在当今快速发展的数字化时代&#xff0c;技术的进步不断推动着工作方式和知识管理的革新。FlowUs&#xff0c;作为一款前沿的知识管理和协作平台&#xff0c;正站在这一变革的浪潮之巅&#xff0c;引领着智能工作的新潮流。 智能化的智能学习引导工具 FlowUs不仅仅是一个工具&…...

Python基础语法(与C++对比)(持续更新ing)

代码块 Python在统一缩进体系内&#xff0c;为同一代码块C{...}内部的为同一代码块 注释 Python 单行注释&#xff1a;#... 多行注释&#xff1a;... C 单行注释&#xff1a;//... 多行注释: /*...*/ 数据类型 1. Python数据类型 Python中支持数字之间使用下划线 _ 分割…...

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…...

AI在软件开发中的角色:助手还是取代者?

目录 前言 一、AI工具现状&#xff1a;高效助手的崛起 二、AI对开发者的影响&#xff1a;新技能与竞争力的重塑 三、AI开发的未来&#xff1a;共生而非取代 写在最后 前言 随着科技的飞速发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域的应用日…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...