【数据结构】二叉树详解(1)

⭐️ 前言

✨ 二叉树的概念性质


⭐️ 二叉树链式结构的实现

结构定义:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int BinaryTreeDataType;typedef struct BinaryTreeNode {BinaryTreeDataType value;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BinaryTreeNode;

⭕️ 二叉树的遍历

按照规则,二叉树的遍历分为:前序/中序/后序的递归遍历。

  • 前序遍历(PreOrder Traversal):访问根节点的操作发生在遍历其左右子树之前。
    • 根 -> 左子树 -> 右子树
  • 中序遍历(InOrder Traversal):访问根节点的操作发生在遍历左右子树之间。
    • 左子树 -> 根 -> 右子树
  • 后序遍历(PostOrder Traversal):访问根节点的操作发生在遍历其左右子树之后。
    • 左子树 -> 右子树 -> 根

在这里插入图片描述


PreOrder 代码:

// 前序遍历递归 根 -> 左子树 -> 右子树
void PreOrder(BinaryTreeNode* root) {if (root == NULL) {printf("# ");return;}printf("%d ", root->value);PreOrder(root->left);PreOrder(root->right);
}

前序递归流程图:
在这里插入图片描述

前序递归遍历顺序为:1 2 3 # # # 4 5 # # 6 # #

InOrder 代码:

// 中序遍历递归 左子树 -> 根 -> 右子树
void InOrder(BinaryTreeNode* root) {if (root == NULL) {printf("# ");return;}InOrder(root->left);printf("%d " , root->value);InOrder(root->right);
}

中序递归流程图:

在这里插入图片描述

中序递归遍历顺序为:# 3 # 2 # 1 # 5 # 4 # 6 #

PostOrder 代码:

// 后序遍历递归 左子树 -> 右子树 -> 根
void PostOrder(BinaryTreeNode* root) {if (root == NULL) {printf("# ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d " , root->value);
}

后序递归流程图:
在这里插入图片描述
后序递归遍历顺序为:# # 3 # 2 # # 5 # # 6 4 1


注:# 代表空树

⭕️ 二叉树的其他接口

// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root);
// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root);
// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k);
// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x);

BinaryTreeSize 代码:

// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root) {if (root == NULL) {return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

BinaryTreeSize 递归流程图:
在这里插入图片描述


BinaryTreeLeafSize 代码:

// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root) {if (root == NULL) {return 0;}if (root->left == NULL && root->right == NULL) {return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

BinaryTreeLeafSize 递归流程图:
在这里插入图片描述


BinaryTreeKLevelSize 代码:

// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k) {assert(k >= 1);if (root == NULL) {return 0;}if (k == 1) {return 1;}return BinaryTreeKLevelSize(root->left , k - 1) + BinaryTreeKLevelSize(root->right , k - 1);
}

BinaryTreeKLevelSize 递归流程图:
在这里插入图片描述


BinaryTreeFind 代码:

// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x) {if (root == NULL) {return NULL;}if (root->value == x) {return root;}BinaryTreeNode* left = BinaryTreeFind(root->left , x);if (left != NULL) {return left;}BinaryTreeNode* right = BinaryTreeFind(root->right , x);if (right != NULL) {return right;}return NULL;
}

BinaryTreeFind 递归流程图:

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python统计与数据分析实战_01】位置与分散程度的度量

数据描述性分析 1.描述统计量1.1 位置与分散程度的度量1.1.1 例子一 单维数组1.1.2 例子二 多维数组 1.2 关系度量1.3 分布形状的度量1.3.1 统计量&#xff1a;偏度和峰度 1.4 数据特性的总括 1.描述统计量 数据的统计分析分为统计描述和统计推断两部分。前者通过绘制统计图、…

港联证券-尾盘集合竞价拉升意味着什么意思?

在股票市场中&#xff0c;尾盘集合竞价是指每个交易日的最后几分钟&#xff0c;即下午14:57到3:00之间的交易。在这段时间内&#xff0c;所有股票的买卖都将以竞价的方式进行&#xff0c;最终价格以最高买价与最低卖价的平均值确定&#xff0c;成交量也将作为当日的收盘价和成交…

Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十二&#xff09;自定义函数模块DebugTalks 序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; pytho…

SQL语句GROUP BY、HAVING、EXISTS、SQL函数(Null判断、日期相关、计算数值和字符串操作 )

目录 GROUP BY HAVING EXISTS SQL函数 Null判断函数 日期数据类型及函数 计算数值和字符串操作函数 AVG(平均值) COUNT(数据条数) FIRST/LAST(第一条数据) MAX/MIN(最大值) SUM(列总和) UCASE/ LCASE (转换大小写) MID(截取字符串) LEN(字符值的长度) ROUND(数…

学习记录——SpectFormer、DilateFormer、ShadowFormer

SpectFormer: Frequency and Attention is what you need in a Vision Transformer, arXiv2023 频域混合注意力SpectFormer 2023 论文&#xff1a;https://arxiv.org/abs/2304.06446 代码&#xff1a;https://badripatro.github.io/SpectFormers/ 摘要视觉变压器已经成功地应用…

nginx基础2——配置文件详解(网页配置篇)

文章目录 一、基本了解二、nginx.conf配置参数2.1 调试参数2.2 必配参数2.3 优化性能参数2.4 event{}段配置参数2.5 网络连接参数2.6 fastcgi配置参数2.7 总结常配参数 三、http{}段配置参数3.1 配置结构3.2 精简配置网页3.3 location定义网页3.3.1 root path用法3.3.1 alias p…

哪些方法可以一键批量查询快递单号

想做好电商或者物流行业&#xff0c;可千万不能虎头蛇尾&#xff0c;前端的高效并不够&#xff0c;我们还要做好后端的及时跟踪维护。当大量快递集中发出之后&#xff0c;我们必须及时地跟踪物流信息&#xff0c;掌握快递的动态&#xff0c;小编今天要和大家安利一款实用的辅助…

Linux系统部署Tomcat详细教程(图文讲解)

前言&#xff1a;本篇博客教大家如何一步一步使用Linux系统去部署自己的Tomcat服务器&#xff0c;每一行代码都是我自己严格执行过的&#xff0c;共分为了8点进行阐述&#xff0c;逻辑清晰&#xff01; 目录 一、安装JDK环境 二、准备Tomcat安装包 三、安装Tomcat 四、配置…

Nuxt.js--》解密Nuxt.js:构建优雅、高效的现代化Vue.js应用

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

精智达在科创板上市:募资约11亿元,深创投等为其股东

7月18日&#xff0c;深圳精智达技术股份有限公司&#xff08;下称“精智达”&#xff0c;SH:688627&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;精智达的发行价为46.77元/股&#xff0c;发行数量为2350.2939万股&#xff0c;募资总额为10.99亿元&#xff0c;…

10-2. 数组 Array 的实例方法

本文并没有写出数组的全部使用方法&#xff0c;想看全的可以看一下这个 Array - JavaScript | MDN 目录 1 常用内置方法 1.1 合并数组 concat() 1.2 复制元素覆盖到指定位置 copyWithin() 1.3 返回其他变量的数组形式 Array.from() 1.3.1 基本使用 1.3.2 将伪数组…

【Linux】udp服务器实现大型网络聊天室

udp终结篇~ 文章目录 前言一、udp服务器实现大型网络聊天室总结 前言 根据上一篇文章中对于英汉互译和远程操作的两个小功能大家应该已经学会了&#xff0c;我们的目的是让大家可以深刻的理解udp服务器所需要的接口已经实现的简单步骤&#xff0c;下面我们开始实现网络聊天室。…