01 概念

 定义:二叉树既然叫二叉树,顾名思义即度最大为2的树称为二叉树。 它的度可以为 1 也可以为 0,但是度最大为 2 。 

一颗二叉树是节点的一个有限集合,该集合:

     ① 由一个根节点加上两棵被称为左子树右子树的二叉树组成     

     ② 或者为空

观察上图我们可以得出如下结论:

     ① 二叉树不存在度大于 2 的节点,换言之二叉树最多也只能有两个孩子。

     ② 二叉树的子树有左右之分,分别为左孩子右孩子。次序不可颠倒,因此二叉树是有序树。

注意:对于任意的二叉树都是由以下几种情况复合而成的

02 满二叉树

定义:一个二叉树,如果每一层的结点数都达到了最大值(均为2),则这个二叉树就可以被称作为 "满二叉树" 。

换言之,如果一个二叉树的层数为 h,且总结点数为 2的 h 次方 - 1,那么它就是一个满二叉树。

计算公式:

 ① 已知层数求总数:N = 2^h-1

 ② 已知总数求层数: h = log_2(N+1)

03 完全二叉树

定义:对于深度为 h 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 h 的满二叉树中编号从 1 至 n 的结点一一对应时称之为完全二叉树。

前 h - 1 层是满的,最后一层不满,但最后一层从左到右是连续的。

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。所以,满二叉树是一种特殊的完全二叉树(每一层节点均为2)。

常识:

① 完全二叉树中,度为 1 的最多只有 1 个。

② 高度为 h 的完全二叉树节点范围是   [ 2^{h-1} - 1 + 1, 2^{h} - 1 ]  

04 二叉树的性质

四点规则:

① 若规定根节点的层数为 1 ,则一颗非空二叉树的第 i 层上最多有 2 的 i - 1 次方个节点。

② 若规定根节点的层数为 1 ,则深度为 h 的二叉树最大节点数是 2 的 h 次方 - 1。

③ 对任何一棵二叉树,如果度为 0 其叶子结点个数为 n0,度为 2 的分支节点个数为 n2,则有n0 = n2 + 1。换言之,度为 0 的永远比度为 2 的多一个叶子结点。

假设二叉树有 n 个结点,从总结点数角度考虑:n = n0 + n1 + n2,从边的角度考虑,n 个结点的任意二叉树,总共有 n - 1 条边。因为度为 0 的结点没有孩子,故度为 0 的结点不产生边; 度为 1 的结点只有一个孩子,故每个度为 1 的结点产生一条边; 度为 2 的结点有 2 个孩子,故每个度为 2 的结点产生两条边,所以总边数为: n1+2*n2,故从边的角度考虑:n - 1 = n1 + 2*n2, n0 + n1 + n2 = n1 + 2*n2 - 1,即:n0 = n2 + 1

④ 若规定根节点的层数为 1 , 具有 n 个节点的满二叉树的深度 h = log(n + 1)。

对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

​ 1. 若 i > 0,i 位置节点的双亲序号:(i - 1) / 2;i = 0,i 为根节点编号,无双亲节点。

​ 2. 若2i + 1 < n,左孩子序号:2i + 1,2i + 1 >= n否则无左孩子。

​ 3. 若2i + 2 < n,右孩子序号:2i + 2,2i + 2 >= n否则无右孩子。

05 二叉树的存储

1 数组存储

一般情况下使用数组来存储,只适合完全二叉树。

如果是非完全二叉树,会造成空间上的浪费。

2 链式存储

typedef struct BinaryTreeNode
{struct BinTreeNode* left; // 左孩子struct BinTreeNode* right; // 右孩子DataType data; // 当前节点值域
}BTree;

06 二叉树的遍历

二叉树的遍历一般有四种方法:前序遍历,中序遍历,后序遍历,层序遍历。

1 前序遍历

先遍历根节点,再依次遍历左子树,右子树。而遍历左子树,又要先遍历根节点,再依次遍历左子树,右子树…直至遍历到空树。

// 递归实现
void PreOrder(BTree*root)
{if (root == NULL)return;printf("%d ", root->data);//根节点PreOrder(root->left);//左子树PreOrder(root->right);//右子树
}

2 中序遍历

先遍历左子树,再依次遍历根节点,右子树。而遍历左子树,又要先遍历左子树,再依次遍历根节点,右子树…直至遍历到空树。

// 递归实现
void Inorder(BTree*root)
{if (root == NULL)return;PreOrder(root->left);//左子树printf("%d ", root->data);//根节点PreOrder(root->right);//右子树
}

3 后序遍历

先遍历左子树,再依次遍历右子树,根节点。而遍历左子树,又要先遍历左子树,再依次遍历右子树,根节点…直至遍历到空树。

// 递归实现
void Postorder(BTree*root)
{if (root == NULL)return;PreOrder(root->left);//左子树PreOrder(root->right);//右子树printf("%d ", root->data);//根节点
}

4 层序遍历

层序遍历顾名思义就是一层一层地遍历,这时就需要借助一个数据结构:队列来辅助实现。

void leverOrder(BTree* root, Queue* pq)
{if (root == NULL)return;QueuePush(pq, root);//插入第一个节点while (!QueueEmpty(pq))//队列不为空{BTree* p = QueueFront(pq);printf("%d ", p->val);QueuePop(pq);if (p->left != NULL)//带入左孩子{QueuePush(pq, p->left);}if (p->right != NULL)//带入右孩子{QueuePush(pq, p->right);}}
}

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

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

相关文章

【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?

单独编译kernel依赖如下几个源码&#xff1a;【交叉编译工具链】prebuilts/clang/host/linux-x86/clang-r487747c【内核源码】kernel-6.1为什么Android下编译内核使用clang作为交叉编译工具链而不是GCC&#xff1f;Android 14 选择使用预置的 Clang 工具链&#xff08;如 clang…

什么是Redis的Pipeline

介绍Redis的Pipeline是一种网络优化技术&#xff0c;在没有Pipeline的时候&#xff0c;客户端往redis发送请求&#xff0c;客户端需要等到redis响应之后才能发送下一个请求。而Pipeline&#xff0c;使redis可以一次性接收多个请求。减少了通信次数&#xff0c;显著的提高了性能…

【ElementUI el-table跨页勾选】

一、el-table需加上refs和 row-key属性 二、type"selection"勾选框 需加上 reserve-selection储备选择属性 三、在分页请求数据时&#xff0c;触发 setSelected()方法 四、在 selection-change变化时保存 selectedRows <el-table ref"tables" :data&quo…

论文阅读/博弈论/拍卖:《Truthful Auction for Cooperative Communications》

摘要&#xff1a;一方面&#xff0c;协作通信由于其在提升无线网络容量方面的巨大潜力而日益受到关注。另一方面&#xff0c;协作通信技术的实际应用却很少见&#xff0c;即使在一些对带宽需求极高的应用场景中&#xff0c;系统设计者也并未采用协作通信技术来开发创新的网络解…

系统软中间件:连接软件与硬件的桥梁

理解“系统软中间件”这个术语很重要&#xff0c;它实际上是两个紧密相关但又不同的概念的组合&#xff1a; 系统软件中间件 严格来说&#xff0c;“系统软中间件”不是一个标准的独立术语。它通常指的是属于系统软件范畴的中间件&#xff0c;或者理解为作为系统软件重要组成部…

音视频学习(六十四):avc1 hvc1和hev1

基础概念缩写编码标准FourCC说明AVC/H.264Advanced Video Codingavc1最常用的 H.264 编码标识符&#xff0c;兼容 MP4/MOV/FMP4 等容器。HEVC/H.265High Efficiency Video Codinghvc1HEVC 视频流在 MP4/FMP4 中常用标识符&#xff0c;要求存储 NALU 的 VPS/SPS/PPS&#xff08;…

【WIT】编程百问一

01 什么时postman&#xff1f; Postman 是一款专门用于帮助开发人员处理 API 的工具&#xff0c;它的作用主要有以下几个方面&#xff1a; 方便调试 API&#xff1a;就像你打电话给别人要先拨对号码一样&#xff0c;开发人员要让不同的软件系统之间通过 API 进行通信&#xff…

RAG 从入门到放弃?丐版 demo 实战笔记(go+python)

背景 我当前有一个业务系统&#xff0c;希望能添加一个机器人助手。直接使用大模型&#xff0c;由于缺少相关的业务数据&#xff0c;效果并不理想&#xff0c;了解一下 RAG。 什么是 RAG RAG(Retrieval Augmented Generation)&#xff0c;搜索引擎 大模型。 简单来说就是从…

《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》

目录 一、左上角绿色启动键凭空消失 1.1 解决办法 二、顶部 File / Edit / View... 整条主菜单栏 罢工 2.1 解决办法 三、左侧 Project 工具窗口 集体失联&#xff0c;只剩 External Libraries 孤零零 3.1 解决办法 昨天下午撸代码&#xff0c;不知道按到了哪儿&#xff…

软件工程实践二:Spring Boot 知识回顾

文章目录一、创建项目&#xff08;Spring Boot 向导&#xff09;二、项目最小代码示例三、运行与验证四、标准目录结构与说明五、Maven 依赖最小示例&#xff08;仅供参考&#xff09;六、常用配置&#xff08;application.yml 示例&#xff09;七、返回 JSON 与统一异常八、Va…

【系列文章】Linux中的并发与竞争[04]-信号量

【系列文章】Linux中的并发与竞争[04]-信号量 该文章为系列文章&#xff1a;Linux中的并发与竞争中的第4篇 该系列的导航页连接&#xff1a; 【系列文章】Linux中的并发与竞争-导航页 文章目录【系列文章】Linux中的并发与竞争[04]-信号量一、信号量二、实验程序的编写2.1驱动…

Elasticsearch启动失败?5步修复权限问题

文章目录&#x1f6a8; 为什么会出现这个问题&#xff1f;✅ 解决方案&#xff1a;修复数据目录权限并确保配置生效步骤 1&#xff1a;确认数据目录存在且权限正确步骤 2&#xff1a;确认 elasticsearch.yml 中的配置步骤 3&#xff1a;**删除或清空 /usr/share/elasticsearch/…

Docker push 命令:镜像发布与管理的艺术

Docker push 命令&#xff1a;镜像发布与管理的艺术1. 命令概述2. 命令语法3. 核心参数解析4. 推送架构图解5. 完整工作流程6. 实战场景示例6.1 基础推送操作6.2 企业级推送流程6.3 多架构镜像推送7. 镜像命名规范详解8. 安全最佳实践8.1 内容信任机制8.2 最小权限原则9. 性能优…

智能合约测试框架全解析

概述 智能合约测试库是区块链开发中至关重要的工具&#xff0c;用于确保智能合约的安全性、正确性和可靠性。以下是主流的智能合约测试库及其详细解析。 一、主流测试框架对比 测试框架开发语言主要特点适用场景Hardhat WaffleJavaScript/TypeScript强大的调试功能&#xf…

【大模型算法工程师面试题】大模型领域新兴的主流库有哪些?

文章目录 大模型领域新兴主流库全解析:国产化适配+优劣对比+选型指南(附推荐指数) 引言 一、总览:大模型工具链选型框架(含推荐指数) 二、分模块详解:优劣对比+推荐指数+选型建议 2.1:训练框架(解决“千亿模型怎么训”) 2.2:推理优化(解决“模型跑起来慢”) 2.3:…

端口打开与服务可用

端口打开与服务可用“端口已打开但服务不可用” 并非矛盾&#xff0c;而是网络访问中常见的分层问题。要理解这一点&#xff0c;需要先明确 “端口打开” 和 “服务可用” 的本质区别&#xff1a;1. 什么是 “端口打开”&#xff1f;“端口打开” 通常指 操作系统的网络层监听该…

ByteDance_FrontEnd

约面了&#xff0c;放轻松&#xff0c;好好面 盲点 基础知识 Function 和 Object 都是函数&#xff0c;而函数也是对象。 Object.prototype 是几乎所有对象的原型链终点&#xff08;其 proto 是 null&#xff09;。 Function.prototype 是所有函数的原型&#xff08;包括 Obje…

go语言,彩色验证码生成,加减法验证,

代码结构相关代码 captcha/internal/captcha/generator.go package captchaimport (_ "embed" // &#x1f448; 启用 embed"image""image/color""image/draw""image/png""io""math/rand""golang.…

PuTTY软件访问ZYNQ板卡的Linux系统

PuTTY 是一款非常经典、轻量级、免费的 SSH、Telnet 和串行端口连接客户端&#xff0c;主要运行于 Windows 平台。它是在开源许可下开发的&#xff0c;因其小巧、简单、可靠而成为系统管理员、网络工程师和开发人员的必备工具。网上有非常多的下载资源。 我们使用PuTTY软件对ZY…

做一个RBAC权限

在分布式应用场景下&#xff0c;我们可以利用网关对请求进行集中处理&#xff0c;实现了低耦合&#xff0c;高内聚的特性。 登陆权限验证和鉴权的功能都可以在网关层面进行处理&#xff1a; 用户登录后签署的jwt保存在header中&#xff0c;用户信息则保存在redis中网关应该对不…