数据结构【二叉树】

news2024/11/25 18:27:22

数据结构之二叉树

  • 二叉树的定义
  • 二叉树的5种基本形态
  • 二叉树的抽象类型定义
  • 二叉树的特殊类型
  • 二叉树的性质
  • 二叉树的存储结构
    • 1、顺序存储
    • 2、链式存储
  • 遍历二叉树
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 遍历算法的分析
  • 线索二叉树

二叉树的定义

在数据结构中,二叉树是n(n>=0)个节点的有限集,它或者是空集(n=0),或者由一个根节点及两棵互不相交的分别称为左子树和右子树。二叉树通常用于实现搜索和排序算法,同时也可以用于存储表达式和计算表达式的值等应用场景。
完全二叉树:
除了最后一层节点可以不满,其他层节点都必须是满的,最后一层的节点从左到右依次排列,如上左图就是完全二叉树
满二叉树:
除了叶子节点,每个节点都有两个子节点。
特点
1、每个节点最多有两个孩子(二叉树中不存在度大于2的节点)。
2、子树有左右之分,其次序不能颠倒。
3、二叉树可以是空集合,根可以有空的左子树或者空的右子树。
注意 二叉树不是树的特殊情况,他们是两个概念。
在这里插入图片描述
在这里插入图片描述

二叉树的5种基本形态

在这里插入图片描述

二叉树的抽象类型定义

CreateBiTree(&Tdefinition)
初始条件:definition给出二叉树T的定义。
操作结果:按definition构造二叉树T。
PreOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:先序遍历T,对每个结点访问一次。
InOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:中序遍历T,对每个结点访问一次。
PostOrderTraverse(T)
初始条件:二叉树T存在。
操作结果:后序遍历T,对每个结点访问一次。
在这里插入图片描述

二叉树的特殊类型

完全二叉树:
除了最后一层节点可以不满,其他层节点都必须是满的,最后一层的节点从左到右依次排列。叶子只能分布在最大的两层上面。

满二叉树:
除了叶子节点,每个节点都有两个子节点,深度为k的满二叉树,有2的k次幂-1个节点。叶子结点都在最底层。
在这里插入图片描述
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

二叉树的性质

1、在二叉树的第i层上至多有2的i-1次幂个节点(i>=1);
2、深度为k的二叉树至多有2的k次幂-1个节点(k>=1);
3、对任意一棵二叉树T,如果其叶子数为n0,度为2的节点数为n2,则n0 = n2 + 1;证明如下:
在这里插入图片描述
4、具有n个节点的完全二叉树的深度为 |log2n|+1。
在这里插入图片描述
5、如果对一棵有n个节点的完全二叉树(深度为|log2n|+1)的节点按层序编号(从第1层到第|log2n|+1层,每层从左到右),则对任一节点有:
在这里插入图片描述
示意图:
在这里插入图片描述

二叉树的存储结构

1、顺序存储

按照顺序存储结构的二叉树节点数值如下:
在这里插入图片描述

2、链式存储

链式存储结构的二叉树如下:
在这里插入图片描述

在这里插入图片描述
实现:

struct BTreeNode{
	elemType data;
	struct BTreeNode *left, *right;  // 左右孩子指针
};

遍历二叉树

二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。
1、LDR 中序遍历:左子树—》根节点—》右子树
2、DLR 前序遍历:根节点—》左子树—》右子树
3、LRD 后序遍历:左子树—》右子树—》根节点

前序遍历

定义
前序遍历通俗的说就是从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左在向右的方向访问。
在这里插入图片描述
在这里插入图片描述

中序遍历

定义
中序遍历就是从二叉树的根结点出发,当第二次到达结点时就输出结点数据,按照先向左在向右的方向访问。
在这里插入图片描述
在这里插入图片描述

后序遍历

定义
后序遍历就是从二叉树的根结点出发,当第三次到达结点时就输出结点数据,按照先向左在向右的方向访问。
在这里插入图片描述
在这里插入图片描述

注意:
已知前序遍历序列和后序遍历序列,不可以唯一确定一棵二叉树。
在这里插入图片描述

遍历算法的分析

在这里插入图片描述
时间效率:O(n) // 每个节点只访问一次
空间效率:O(n) // 栈占用的最大辅助空间

线索二叉树

如果某个结点的左孩子为空,则将空的左孩子指针域改为指向其前驱;如果某结点的右孩子为空,则将空的右孩子指针域改为指向其后继,这种改变指向的指针称为“线索”
加上了线索的二叉树称为线索二叉树(Threaded Binary Tree)。
对二叉树按某种遍历次序使其变为线索二叉树的过程叫线索化。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

uniapp 封装公共方法(无需每个页面引用,直接调用)

封装方法: 1. 在根目录下建立common文件夹 创建com.js 2.在main.js中挂载(写在定义vue之后) import $com from /common/com.js Vue.prototype.$com $com 3.在com.js中按照以下格式定义方法 export default {//定义需要的方法 } 4.使用 click"$com.已经定义的方法名&q…

分布式定时任务xxl-Job

目录 前言 项目介绍 1.源码目录介绍 2 “调度数据库”配置 3 架构设计 3.1 设计思想 5.3.3 架构图 实战 1.服务端部署 2.执行端配置 3.任务开发 3.1 基于方法注解任务 3.2 基于api任务 3.3 分片广播任务 4.任务执行 4.1 单任务执行 4.2 子任务执行 4.3 分片广…

高并发的哲学原理(二)-- Apache 的性能瓶颈与 Nginx 的性能优势

每一名后端开发可能都知道 Nginx 比 Apache 性能强,但是为什么强,强在哪里,接下来我们动手实验解答这个问题。 Nginx 利用了新的 Linux kernel API Nginx 利用了 Linux 内核引入的 epoll 事件驱动 API,大幅降低了海量 TCP 连接下…

IDEA+springboot+ssm+layui+mysql高校宿舍管理系统源码

IDEAspringbootssmlayuimysql高校宿舍管理系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.宿舍列表3.预分配宿舍4.宿舍分配信息5. 留校管理6. 报修管理7. 留言管理8.卫生管理9.我的宿舍10.我的报修11.卫生检查记录12.离校登记13.留校申请14.返校登记15.留言板16.…

IDEA+springboot + ssm +shiro+ easyui +mysql实现的进销存系统

IDEAspringboot ssm shiro easyui mysql实现的进销存系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.首页3.修改密码4.系统日志5. 用户管理6. 角色管理7. 进货入库8.退货出库9.进货单据查询10.退货单据查询11.当前库存查询12.销售出库13.客户退货14. 销售单据查询15…

消息中间件选型RabbitMQ基础入门

1. 消息中间件(MQ) 1.1 概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构 目前使用较多的消息队列有ActiveMQ&#xff…

使用 Docker 在 Windows、Mac 和 Linux 系统轻松部署 PostgreSQL 数据库

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

本地运行Segment Anything

按原项目GitHub - facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.步骤 Ins…

Apache Phoenix(1):Phoenix介绍

Phoenix官方网址:http://phoenix.apache.org/ 1 简介 Phoenix官网:「We put the SQL back in NoSQL」 Apache Phoenix让Hadoop中支持低延迟OLTP和业务操作分析。 提供标准的SQL以及完备的ACID事务支持通过利用HBase作为存储,让NoSQL数据库具…

一些三维点云去噪算法

1 什么是去噪 1.1 噪声 噪声:也称为孤立点/离群点/异常点,是指点云数据中的不相关或不希望存在的干扰信号或误差。噪声来源:环境光线的明亮程度、测量设备精度及系统误差、物体材料及表面的纹理和人为抖动等因素影响。 1.2 噪声来源 环境…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

6.EFLFK(EFLK+kafka)

文章目录 EFLFK(EFLKkafka)zookeeper概述Zookeeper 特点数据结构和工作场景选举机制(重要)总结部署Zookeeper kafka为什么用消息队列(MQ)中间件使用消息队列的好处消息队列模式消息队列总结:kafka概述Kafka特性Kafka架…

Layui之选项卡案例 详细易懂

⭐ 本期精彩: 利用Layui框架实现动态选项卡 ⭐ 继上一篇已经实现了左边的树形菜单栏,这一关卡我们已通过,接下来就是实现右边的动态选项卡的关卡,上个关卡的效果及链接 ⭐ 链接:http://t.csdn.cn/tYccL 目录 ⭐ 本期精彩&#xf…

2023秋招,网络安全面试题

Hello,各位小伙伴,我作为一名网络安全工程师曾经在秋招中斩获🔟个offer🌼,并在国内知名互联网公司任职过的职场老油条,希望可以将我的面试的网络安全大厂面试题和好运分享给大家~ 转眼2023年秋招已经到了金…

E510-A1S-I0/A0插头式连接比例放大器

E510-A1S-U0/A1、E510-A1S-I4/A1、E510-A1S-U0/B2、E510-A1S-I4/C0、E510-A1S-U0/A2、E510-A1S-I0/A0、E510-A1S-U0/A3(BEUEC)插头式比例阀放大器内部装有一个STM微处理器接受两个来自外部输入的模拟量指令信号和三个设定参数的内置电位器模拟量&#xf…

前端 - 接口请求抓包 Status Canceled 分析

问题描述 上图是来自于百度的抓包请求分析状态,一般常见的有 status 200,500,404,504,403,302……但这次遇到一个 status canceled(第一次遇见还真一脸懵~) 原因分析 那响应statu…

MySQL 的内连接、左连接、右连接有有什么区别?

MySQL的连接主要分为内连接和外连接,外连接常⽤的有左连接、右连接。 inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集;left join左连接在两张表进行连接查询时,会返回左表所有的行&#x…

安卓OpenCV开发(六)图片处理(1)

使用OpenCV进行图片处理(1) 基础知识可以回顾我之前写的文章: OpenCV导入 OpenCV人脸检测 OpenCV竖屏检测 OpenCV人脸识别 OpenCV小狗识别 本文将提供一下openCv处理图片的处理,文末附上代码链接。 (1)灰…

kali NetHunter刷入

准备 安卓frida逆向协议与分析第一章中提供的刷机教程,Nexus 5X手机一部,kali NetHunter镜像,kali Linux(因为很多命令需要LInux命令不能直接用windows) 命令开发包下载 adbfastboot https://developer.android.com/studio/releases/platf…

执行Spark应用架构需要经历哪几个阶段?

将程序切换到【Executors】Tab页面时,我们可以看到Spark Application运行到集群上时,由两部分组成:Driver Program和Executors。 从图中可以看到Spark Application运行到集群上时,由两部分组成:Driver Program和Execut…