二叉树-理论基础

news2024/11/18 1:36:19

文章目录

  • 前言
  • 一、二叉搜索树
    • 平衡二叉搜索树
  • 二、二叉树的存储方式
  • 二叉树的遍历方式
  • 二叉树的定义
  • 总结


前言

二叉树有两种主要的形式:满二叉树和完全二叉树。满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
在这里插入图片描述
这棵树为满二叉树,深度为k,有2^k-1个节点的二叉树。
完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点。举例:
在这里插入图片描述
我们之前章节介绍的优先级队列其实是一个堆,堆是一种特殊的完全二叉树,而不是所有完全二叉树都可以被称为堆。只有符合堆的定义和性质的完全二叉树才能被称为堆(完全二叉树需保证父子节点的顺序关系)。


一、二叉搜索树

二叉搜素树是有数值的树,且是一个有序树。
1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.它的左、右子树也分别为二叉排序树
举例:
在这里插入图片描述

平衡二叉搜索树

又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
举例:
在这里插入图片描述
最后一棵 因为它的左右两个子树的高度差的绝对值超过了1,所以不是平衡二叉树。
C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn(红黑树是一种自平衡的二叉搜索树,当红黑树的节点数量n增加时,树的高度以对数形式增长。由于每次查找、插入或删除操作都是从根节点开始,沿着一条路径向下进行,因此这些操作的时间复杂度与树的高度成正比。由于红黑树的高度是O(log n),因此查找、插入和删除操作的时间复杂度也是O(log n)。这使得红黑树成为一种高效的数据结构,特别适用于需要频繁执行这些操作的场景。),注意unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表(哈希表的基本思想是通过将关键字映射到数组的特定位置来实现快速的数据查找。它提供了高效的查找和插入操作,适用于大量数据和高速访问的需求。时间复杂度是常数项O(1))。
所以大家使用自己熟悉的编程语言写算法,一定要知道常用的容器底层都是如何实现的,最基本的就是map、set等等,否则自己写的代码,自己对其性能分析都分析不清楚!

二、二叉树的存储方式

二叉树可以链式存储,也可以顺序存储。
那么链式存储方式就用指针, 顺序存储的方式就是用数组。
顾名思义就是顺序存储的元素在内存是连续分布的,而链式存储则是通过指针把分布在各个地址的节点串联一起。
链式存储:
在这里插入图片描述
顺序存储就是用数组来存储二叉树,顺序存储图如下:
在这里插入图片描述
那么问题来了,有人会问,用数组来存储二叉树如何遍历呢?
答:如果父节点的数组下标是 i,那么它的左孩子就是 i * 2 + 1,右孩子就是 i * 2 + 2;但是用链式表示的二叉树,更有利于我们理解,所以一般我们都是用链式存储二叉树。
所以大家要了解,用数组依然可以表示二叉树


二叉树的遍历方式

谈到遍历方式,大部分人都会想动前后中序遍历还有层序遍历,但是缺乏一个框架,下面我们把二叉树的几种遍历方式列出来,大家就可以一一串起来了。二叉树主要有两种遍历方式:
深度优先遍历:先往深走,遇到叶子节点再往回走。
广度优先遍历:一层一层的去遍历。
这两种遍历是图论中最基本的两种遍历方式,后面在介绍图论的时候还会介绍它们滴。
那么从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:
深度优先遍历
前序遍历(递归法,迭代法)
中序遍历(递归法,迭代法)
后序遍历(递归法,迭代法)
广度优先遍历
层次遍历(迭代法)
在深度优先遍历中:有三个顺序,前中后序遍历, 这几个遍历容易经常搞混,这里教大家一个技巧(其实指的就是中间节点的遍历顺序,只要大家记住前中后序指的就是中间节点的位置就可以了)。
注意:看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式
前序遍历左右
中序遍历:左
后序遍历:左右
举例:
在这里插入图片描述
最后再说一说二叉树中深度优先和广度优先遍历实现方式,我们做二叉树相关题目,经常会使用递归的方式来实现深度优先遍历,也就是实现前中后序遍历,使用递归是比较方便的
之前我们介绍栈与队列的时候,就说过栈其实就是递归的一种实现结构,也就说前中后序遍历的逻辑其实都是可以借助栈使用非递归的方式来实现的
广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。
在这里其实我们又了解了栈与队列的一个应用场景了!


二叉树的定义

链式存储的二叉树节点的定义方式。
C++代码如下:

struct TreeNode{
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x):val(x),left(NULL),right(NULL) {}
};

Python版本代码:

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

大家会发现二叉树的定义和链表是差不多的,相对于链表,二叉树的节点里多了一个指针,有两个指针,指向左右孩子。
**注意:**大家要注意二叉树节点定义的书写方式。因为在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。
我们在刷leetcode的时候,节点的定义默认都定义好了,真到面试的时候,需要自己写节点定义的时候,有时候会一脸懵!


总结

二叉树是一种基础数据结构,在算法面试中是常客,也是众多数据结构的基石。本篇我们介绍了二叉树的种类、存储方式、遍历方式以及定义,帮助大家扫一遍基础,比较全面的介绍了二叉树各个方面的重点。说到二叉树,就不得不说递归,很多同学对递归都是又熟悉又陌生,递归的代码一般很简短,但每次都是容易一看就会,一写就废。
(PS:感兴趣或者想共同学习的同学,可以关注本人公众号HEllO算法笔记,不再迷路!)

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

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

相关文章

16.vant Weapp

目录 1 使用npm 2 安装 vant 3 构建npm 4 去除 style:v2 5 使用 vant 6 样式变量 1 使用npm 微信小程序不支持下面三种包 不支持依赖 Node.js 内置库的包不支持依赖 浏览器内置对象 的包不支持依赖 C插件 的包 除去上面三种,能用的包就不多了&#…

面向AI的新编程范式

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 联合制作 / 声网 产品统筹 / bobo 录音间 / 声湃轩北京站 在这期播客节目中,我们将探讨AI与程序员如何共同进步。随着AI热潮席卷全球,许多程序员尝试着使…

python爬虫_python基础数据类型

文章目录 ⭐前言⭐python💖 Number💖 String💖 List💖 Tuple💖 Dict ⭐结束 ⭐前言 大家好,我是yma16,本文分享关于python的基础数据类型,作为python爬虫专栏的基石。 ⭐python 发…

【Note8】网络管理

文章目录 1.MII介绍2.BMC MAC3.MDIO&MDC4. 1.MII介绍 SOC内部没有网络MAC外设:缺:网络效率不高,一般芯片内置的MAC会网络加速引擎,如网络专用DMA,网络处理效率会很高。 SOC内部集成网络MAC外设:MII/RM…

【MySQL】不就是子查询

前言 今天我们来学习多表查询的下一个模块——子查询,子查询包括了标量子查询、列子查询、行子查询、表子查询,话不多说我们开始学习。 目录 前言 目录 一、子查询 1. 子查询的概念 2. 子查询语法格式 2.1 根据子查询结果不同可以分为:…

C++——内联函数

目录 1. 概念 2.特性 3. 经典面试题 1. 概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。 以Add函数为例: int Add(int x, int y) {int z x…

RabbitMQ基础与实操复习

RabbitMQ基础复习 1、MQ引言1.1 什么是MQ1.2 MQ有哪些1.3 不同MQ特点 2、RabbitMQ引言2.1 RabbitMQ2.2 RabbitMQ安装 3、RabbitMQ配置3.1 RabbitMQ命令行3.2 Web管理界面3.2.1 overview概览3.2.2 Admin用户和虚拟主机管理 4、RabbitMQ常用消息模型测试4.1 RabbitMQ支持的消息模…

RabbitMQ应用场景和集群搭建复习

RabbitMQ应用场景和集群搭建 1. MQ的应用场景1.1 异步处理1.2 应用解耦1.3 流量削峰 2、RabbitMQ集群搭建2.1 普通集群(副本集群)2.1.1 架构图2.1.2 集群搭建1、集群规划:这里用三台虚拟机测试2、克隆三台机器主机名和ip映射3、 在其他两台节点上安装rabbitmq4、后台…

Neurophotonics | HyperOptoNet:用于fNIRS超扫描脑间神经同步分析的MATLAB工具箱

导读 意义:本研究开发了一个基于MATLAB的工具箱,用于脑间同步(IBS)分析,并进行了实验研究以验证其性能。据所知,这是第一个基于功能近红外光谱(fNIRS)超扫描数据的IBS工具箱,可在两个三维(3D)头部模型上直观地显示结果…

Elasticsearch:analyzer

前奏 es的chinese、english、standard等分词器对中文分词十分不友好,几乎都是逐字分词,对英文分词比较友好。 在kibana的dev tools中测试分词: POST /_analyze {"analyzer": "standard","text": "你太…

用OpenCV进行透视变换

1. 引言 欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。 闲话少说,我们直接开始吧! 2. 单应矩阵 我们首先展开对单应矩阵的深入研究。作为图…

车载-惯性导航系统

概念 惯性导航系统是一种不受电磁波干扰,且不依靠外界信号即可完成自主定位的导航系统。 惯性导航系统的主要定位测量装置由加速度传感器和陀螺仪组成。其中,加速度传感器是用来测量载体所受到的惯性力,并通过牛顿第二加速度定律获取被测载…

OpenGL 面剔除

1.简介 OpenGL能够检查所有面向观察者的面,并渲染它们,而丢弃那些背向的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面,哪些面是背向面。OpenGL使用…

Axure教程——走马灯

本文介绍用Axure中的动态面板制作走马灯效果 一、效果 预览地址:https://okjxsd.axshare.com 二、功能 1、图片自动播放并显示其状态 2、点击左右箭头,图片播放并显示其状态 三、制作 1、动态面板制作 拖进一个动态面板元件,设置尺寸&#…

RISC-V semi-hosting原理以及实践

嵌入式裸机调试需要在有限资源的目标硬件上尽可能挖掘更多的信息,比如打印寄存器等等,但是即便看似很简单的串口打印,在有的情况下也是奢望,针对这种情况,能够有效利用主机资源协同调试的semi-host(半主机&…

B. Fish Graph(dfs找环)

Problem - 1817B - Codeforces 给定一个具有n个节点和m条边的简单无向图。请注意,该图不一定是连通的。节点从1到n标记。 如果图包含具有特殊节点u的简单循环,则定义图为Fish Graph。除循环中的边之外,图应恰好有2条额外的边。两条边都应连接…

设计模式之外观模式笔记

设计模式之外观模式笔记 说明Facade(外观)目录外观模式示例类图电灯类电视机类空调类智能音箱外观类测试类 说明 记录下学习设计模式-外观模式的写法。JDK使用版本为1.8版本。 Facade(外观) 意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高…

【2023,学点儿新Java-23】初步了解Java中的修饰符:static及其作用、native特性、final的理解

前情回顾: 【2023,学点儿新Java-22】Java中package的作用是什么 | Java中import的用法 | Java中的权限修饰符:private、protected、public【2023,学点儿新Java-21】Java中default的语法格式 | 父类私有的方法能被重写吗&#xff…

三分钟学习一个python小知识3-----------我的对python的列表和元组的理解

我的目录 1、python是什么2、列表的应用3. 元组的应用:4、深层次地进一步理解列表和元组4.1. 列表示例:4.2. 元组示例: 总结 1、python是什么 在Python中,列表和元组都是用于存储多个数据项的数据结构,但是它们有一些…

JavaWeb Tomcat

1.Web分类 静态web html这样的静态网页,只展示预先设定好的内容每个用户看到的内容是一样的不连接数据库,无法持久化数据(比如注册)动态web 动态展示内容每个用户看到的内容是不一样的,比如会有个性化推荐连接数据库&…