一文读懂二叉树

news2025/1/21 2:49:33

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

什么是二叉树

二叉树是一种由节点(Node)组成的数据结构,每个节点最多有两个子节点。它具有良好的层次结构,便于搜索和遍历。二叉树的定义和操作方法可以通过面向对象的方式来理解,每个节点都是一个对象,节点之间通过引用关系连接。

常见的二叉树有哪些

  1. 满二叉树
  2. 完全二叉树

什么是满二叉树

如图所示:

在这里插入图片描述
这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。根节点为 k = 1 的深度开始计算,如图所示的二叉树,它的深度为 4 ,所以这棵满二叉树有15个节点。

什么是完全二叉树

完全二叉树中,除了最底层节点以外,其余每层节点数都达到最大值,并且最下面一层的节点从左到右是连续的,这样的二叉树为完全二叉树。

如图1所示:最底部的节点数从左至右是连续的,该树为完全二叉树

在这里插入图片描述
如图2所示:从左至右是连续的,因此也是完全二叉树

在这里插入图片描述

如图3所示:最底部的节点不是连续的,该树不是一个完全二叉树

在这里插入图片描述

什么是二叉搜索树

前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,二叉搜索树是一个有序树。

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 它的左、右子树也分别为二叉排序树

如图所示:这棵树就是一颗二叉搜索树

在这里插入图片描述

什么是平衡二叉搜索树

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

它通过在插入和删除节点时进行旋转操作来保持树的平衡。AVL树的平衡因子(左子树高度减去右子树高度的差值)在范围[-1, 1]之间。

如图所示:这是一颗平衡二叉树,它的左右两个树的高度差在为1

在这里插入图片描述

如图所示:它的高度差为1,因此也是一个平衡二叉搜索树

在这里插入图片描述

如图所示:它的高度差已经大于1了,这不是一棵平衡二叉搜索树

在这里插入图片描述

二叉搜索树的存储方式

二叉搜索树的存储方式主要有两种:链式存储和数组存储。

  1. 链式存储:
    在链式存储方式中,每个节点由一个对象(或结构体)表示,并包含指向其左子节点和右子节点的指针(或引用)。每个节点的结构可以包含一个键(用于比较和排序)以及其他相关数据。
    优点:
    灵活性:链式存储方式可以动态地分配内存,并且可以根据需要插入、删除节点,使得树的结构可以动态变化。
    插入和删除效率高:由于节点的指针连接,插入和删除操作只需要改变指针的指向,效率较高。
    缺点:
    需要额外的指针空间:每个节点需要存储左子节点和右子节点的指针,占用额外的空间。
    指针操作可能增加内存开销:在大规模数据集的情况下,节点对象和指针操作可能导致额外的内存开销。

如图所示:链式存储

在这里插入图片描述

  1. 数组存储:
    在数组存储方式中,使用一个数组来表示二叉搜索树的结构。数组的索引位置对应着节点的顺序,节点的值存储在数组中的对应位置。
    优点:
    内存连续:数组存储方式使用连续的内存空间,可以减少指针操作的开销。
    访问效率高:通过数组的索引可以直接访问节点,查找效率较高。
    缺点:
    静态结构:数组存储方式需要预先确定数组的大小,无法动态调整树的结构,因此不适用于频繁的插入和删除操作。
    内存空间浪费:如果树的大小不确定,可能会浪费一部分数组空间。

    如图所示:数组存储

    在这里插入图片描述

在这里插入图片描述
如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2。

但是用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。

二叉树的遍历

二叉树主要有两种遍历方式:

  1. 深度优先遍历:先往深走,遇到叶子节点再往回走,一条路走到黑,走到最低部再回退回来。
    前序遍历(递归法,迭代法)
    中序遍历(递归法,迭代法)
    后序遍历(递归法,迭代法)
  2. 广度优先遍历:一层一层的去遍历。
    层次遍历(迭代法)

什么是前序遍历

前序遍历就是从根节点开始,先遍历中间节点,在遍历左节点(同时左节点又分为中-》左-》右),最后遍历右节点(同时右节点又分为中-》左-》右)

如图所示:
这棵树前序遍历的结果是:10 5 2 8 15 13 16

在这里插入图片描述

什么是中序遍历

同理,中序遍历就是先遍历左节点(同时左节点分为左中右),再遍历中节点,最后遍历右节点(右节点也按照左中右来遍历)

如上图所示:
中序遍历结果是:2 5 8 10 13 15 16

什么是后续遍历

同理,后续遍历就是先遍历左节点(同时左节点分为左右中),再遍历右节点(右节点也按照左右中国来遍历),最后处理中间节点

如上图所示:
后续遍历结果是:2 8 5 13 16 15 10

通过上面的遍历结果其实可以了解到,前中后序遍历对应的中间节点的位置分别为前中后,所以前中后序遍历代表着中间节点所对应的位置。

手写一个二叉搜索树

不废话,上代码:

public class TreeNode {
    int val; // 数值

    TreeNode left; // 左指针,指向左孩子

    TreeNode right; // 右指针,指向右孩子

    public TreeNode() {

    }

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

备注:笔记整理,部分图片来自《代码随想录》,深度学习所整理

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

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

相关文章

chatgpt赋能python:Python如何将IP地址转换为整数

Python如何将IP地址转换为整数 在计算机网络中,IP地址是一个包含32位的二进制数字,通常由四个8位二进制数字(即“点分十进制”)表示。但在某些情况下,需要将IP地址转换为整数,例如在网络编程中检查网络连接…

C语言:编写代码,演示多个字符从两端移动,向中间汇聚

题目: 给出第一个字符串,如:"welcome to school!!!!!", 设置第二个字符串:"######################", 两字符串字符数相等。 从第二个字符串两端开始移动,向中间汇聚&#…

Python 中判定整数

直接数值判定,表达式判定。 (本笔记适合学会 Python 基本数据类型,可以“融会贯通”的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》&#…

IGP协议对SR-MPLS的扩展

目录 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展 ISIS对邻接SID做了细分 ISIS定义的Sub-TLV的类型 ISIS定义的Sub-TLV的报文格式 OSPF对于SR-MPLS的扩展 OSPF为了支持SR-MPLS通过新…

Vue.js 3.x Composition APIs 及简单使用

文章目录 Vue 3.0 和 2.x 的区别源码组织方式packages 目录结构 不同构建版本Composition API 设计动机设计动机Options API Demo:Composition API Demo:对比: 性能提升响应式系统升级编译优化优化打包体积 ViteESModuleVite as Vue-CLIVite 特点 Composition APICo…

NLP学习笔记三-数据处理基础

NLP学习笔记三-数据处理基础 NLP设计的处理处理技术也比较多,我们简单介绍一部分: 1.Tokenization NLP当中的Tokenization,博主以前无论是在文章中还是在代码中都能经常看到,这在自然语言处理中也是比较常用的技术。 Tokenizati…

ASEMI代理英飞凌TLD2314EL参数,LED驱动器TLD2314EL

编辑-Z TLD2314EL参数描述: 型号:TLD2314EL 电源电压VS:40V 输出电压VOUTx:40V 状态电压VST:6V 输出电流IOUTx:130 mA 结温Tj:-40~ 150℃ 储存温度Tstg:-55~ 150℃ 正常工作…

要不是和阿里P7聊过,我也不知道自己是个棒槌

前几天和一个朋友聊面试,他说上个月同时拿到了测试开发岗位腾讯和阿里的offer,最后选择了阿里。 阿里内部将员工一共分为了14个等级,P6是资深工程师,P7是技术专家。 其中P6和P7就是一个分水岭了,P6是最接近P7的不持股…

# Windows 专业版安装 Hyper-V

Windows 专业版安装 Hyper-V 文章目录 Windows 专业版安装 Hyper-V检查要求硬件要求安装方式使用 PowerShell 启用 Hyper-V使用 CMD 和 DISM 启用 Hyper-V通过设置启用 Hyper-V 角色 创建虚拟机Hyper-v 管理器创建Hyper-V Quick Create 完整官网地址:Windows 10 上的…

SpringCloud-Gateway的详细讲解以及完整的示意图和代码-下

目录 二说Gateway 路由配置 创建com/springcloud/config/GateWayRoutesConfig.java 测试 动态路由 示意图 代码实现 测试 注意事项和细节 代码 Predicate/断言 基本介绍 Route Predicate Factories 解读 Route Predicate 实例 After Route Predicate 测试 B…

tamper脚本编写与mitmdump

tamper脚本编写与mitmdump 0x01 前提 ​ 注入点在登录框处,但是目标每次都会先校验验证码,而验证码会在返回包中以json格式出现。 0x02 编写tamper脚本 由于目标的验证码在response中回显出来了,所以我们可以利用tamper脚本去读取验证码&a…

Python:SVOREX

公式看懂了就写导数。写完导数撸码 Car数据集上对比: 在Car数据集上,SVOREX稍微胜出。 """ SVOREX author: Daniel He at CQUPT 2023-06-08 """ import xlwt import xlrd import numpy as np import pandas as pd import matplotlib.pylab a…

17.16按摩师

目录 一、题目 二、分析代码 一、题目 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 二、分析代码 class Solution { public:int massage(vector<int>& nums) {int nnums.size();// vector<int>dp(n,0);// if(n<0)// return 0;// if(n1…

Docker部署ssh连接工具webssh2

Docker部署ssh连接工具webssh2 一、检查系统版本二、检查docker状态三、下载webssh2镜像四、创建webssh2容器1.创建webssh2容器2.查看webssh2状态3.查看容器运行日志 五、访问webssh21. 访问webssh22. 远程连接服务器3. 文件管理 一、检查系统版本 检查操作系统版本 [rootserve…

Python对普通文件的操作

目录 1. 常用函数语法 1.1. open_打开文件 1.2. read_读取文件 1.3. readlines_读取文件 1.4. csv.reader_读取csv文件 1.5. write_写入内容 2. 操作普通文件 2.1. 读取内容 ① 按大小读取 ② 按行数读取 ③ 按列数读取 ④ 读取大文件 ⑤ 条件过滤 2.2. 写入内容…

一文详解!JMeter该如何并发测试和持续性压测?

目录 前言&#xff1a; 概念 并发测试 持续性压测 查看报告 总结 试试其他 API 工具 知识扩展&#xff1a; 前言&#xff1a; JMeter 是一个 Java 编写的开源负载测试工具&#xff0c;基于模拟用户、线程和请求&#xff0c;结合测试计划和策略&#xff0c;可以模拟真实…

和托托一起学计算机图形学(一)-初识计算机图形学

文章目录 初识计算机图形学一、计算机科学与视觉信息处理二、计算机图形学的应用三、总结 数字图像基础一、像素二、RGB和CMY颜色模型三、颜色编码四、查色表五、图像文件六、总结 初识计算机图形学 一、计算机科学与视觉信息处理 计算机图形学&#xff1a;建模&#xff08;建…

Kafka-Eagle安装及连接成功web端登陆不了问题解决

kafka自身并没有集成监控管理系统&#xff0c;因此对kafka的监控管理比较不便&#xff0c;好在有大量的第三方监控管理系统来使用&#xff0c;常见的有&#xff1a; Kafka EagleKafkaOffsetMonitorKafka Manager&#xff08;雅虎开源的Kafka集群管理器&#xff09;Kafka Web C…

1.7 基于XML配置方式使用Spring MVC

一、基于XML配置与注解的方式使用Spring MVC 1、创建Maven项目 Maven项目 - SpringMvcDemo01 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加支持Spring MVC的相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmln…

excel学习--开始界面控制台讲解

1、部分基础控制台讲解 上面的那行表示垂直居中 下面的那行表示水平居中 上面设置表格内容的表现方向 下面设置表格内容的缩进量 合并单元格的两种主要方式即左图所示&#xff0c;一种是跨越合并&#xff0c;另一种是合并单元格&#xff0c;跨越合并只能进行列合并&#xff0c…