数据结构入门 — 二叉树的概念、性质及结构

2023-09-17 16:31:51

本文属于数据结构专栏文章,适合数据结构入门者学习,涵盖数据结构基础的知识和内容体系,文章在介绍数据结构时会配合上动图演示,方便初学者在学习数据结构时理解和学习,了解数据结构系列专栏点击下方链接。


  • 博客主页:Duck Bro 博客主页
  • 系列专栏:数据结构专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

数据结构入门 — 二叉树的概念、性质及结构

本文关键字:二叉树、概念、存储结构、性质


一、二叉树的概念

二叉树是一种数据结构,由一组节点组成,每个节点最多有两个子节点,称为左子节点和右子节点。二叉树可以为空树,也可以是一个只有根节点而没有子节点的单节点树,或者是一个有多个节点的树,每个节点都有且仅有一个父节点。

对于任意的二叉树都是由以下几种情况复合而成的:
在这里插入图片描述

一个二叉树要么为空树,要么由一个根节点和两棵分别称为左子树和右子树的二叉树组成。
在这里插入图片描述

注意:

  1. 二叉树不存在度大于2的结点
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

二、特殊的二叉树

特殊的二叉树有很多种,几种特殊的二叉树都有其独特的特点,在不同的场景下有不同的应用

名称说明
完全二叉树除了最后一层节点不满以外,其它每层节点数都达到最大值。在最后一层上只缺少右侧连续若干节点。
满二叉树每个节点都有零或两个子节点,且所有叶子节点都在同一层上。
平衡二叉树一棵空树或者左右两个子树高度差的绝对值不超过 1,且左右两个子树都是平衡二叉树。
二叉搜索树(BST)一棵空树或者满足以下特点的二叉树:对于任意节点,左子树中的所有节点小于该节点的值,右子树中的所有节点大于该节点的值。
红黑树一棵自平衡二叉搜索树,具有以下特点:每个节点要么是红色,要么是黑色,根节点是黑色,叶子节点是黑色的空节点,红色节点的子节点只能是黑色的节点,从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
B 树一种自平衡的多路搜索树,能够支持对数据的高效操作,主要应用于文件系统和数据库管理系统等领域。

三、二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2 ( n − 1 ) 2^{(n-1)} 2(n1)个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h -1 2h1 .
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n 0 n_{0} n0 , 度为2的分支结点个数为 ,则有 n 0 = n 2 + 1 n_{0}=n_{2}+1 n0=n2+1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度, h = l o g 2 ( n + 1 ) h= log_{2}(n+1) h=log2(n+1). (ps: l o g 2 ( n + 1 ) log_{2}(n+1) log2(n+1)是log以2
    为底,n+1为对数)
  5. 对于具有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否则无右孩子

四、二叉树的结构

二叉树有两种基本的存储结构:顺序存储和链式存储。

1. 顺序存储法

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆后面的文章会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
在这里插入图片描述

2. 链式存储法

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。


在这里插入图片描述

更多推荐

Redis 面试常见问答

本文出自:https://thinkinjava.cn作者:莫那鲁道1.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓存宕机使用断路器,如果缓

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录一、Redis分布式锁1.1、什么是分布式锁1.2、分布式锁的基础实现1.2.1、引入场景1.2.2、基础实现思想1.2.3、引入setnx1.3、引入过期时间1.4、引入校验id1.5、引入lua脚本1.5.1、引入lua脚本的原因1.5.2、lua脚本介绍1.6、过期时间续约问题(看门狗WatchDog)1.7

十四、流式编程(2)

本章概要中间操作跟踪和调试流元素排序移除元素应用函数到元素在map()中组合流中间操作中间操作用于从一个流中获取对象,并将对象作为另一个流从后端输出,以连接到其他操作。跟踪和调试peek()操作的目的是帮助调试。它允许你无修改地查看流中的元素。代码示例:Peeking.javaclassPeeking{publicst

Docker概念通讲

目录什么是Docker?Docker的应用场景有哪些?Docker的优点有哪些?Docker与虚拟机的区别是什么?Docker的三大核心是什么?如何快速安装Docker?如何修改Docker的存储位置?Docker镜像常用管理有哪些?如何创建Docker容器?Docker在后台的标准运行过程是什么?Docker网络模式

Apollo

Apollo🍓目前市面上比较多的配置中心🍓Apollo组件🍓Apollo特性🍓Apollo服务端安装🍓部署架构🍓核心概念🍓客户端连接Apollo🍓配置发布原理代码地址:https://gitee.com/xuhx615/apollo-demo.git🍓目前市面上比较多的配置中心⭐Disconf百度开源

Dubbo3基础使用

1、Dubbo概述现在SpringCloudAlibaba比较火,用的比较多是吧,那dubbo是不是过时的呢?并不是的,以前有人把Dubbo和SpringCloud进行对比,其实两者是不同维度的,不能对比,dubbo就是一个rpc框架,SpringCloud是一个生态,里面包括很多组件,并且dubbo3也可以和Spri

【K8S系列】深入解析k8s网络插件—Weave Net

序言做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点Kubernetes(k8s)是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s网络插件-WeaveNet相关知识希望这篇文章能让你不仅有一定的收

一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT

夕小瑶科技说原创编译|谢年年大语言模型LLM被视为一个巨大的知识库,它可以根据你提出问题或陈述的方式来提供答案。就像人类可能会根据问题的不同提供不同的答案一样,LLM也可以根据输入的不同给出不同的答案。因此,你的问题或陈述方式就显得非常重要。如何引导大语言模型给出更恰当的答案,是最近研究的热点。经常用到的方法如让大模型

Python基础学习笔记3

深度学习实践深度学习离不开编程深度学习离不开数学分析(高等数学)、线性代数、概率论等知识,更离不开以编程为核心的动手实践。Python编程语言无论是在机器学习还是深度学习中,Python已经成为主导性的编程语言。而且,现在许多主流的深度学习框架都提供Python接口,Python被用于数据预处理、定义网络模型、执行训练

2023华数杯数学建模A题2023华数杯A 题隔热材料的结构优化控制研究

问题1问题1:该问题需要建立一个数学模型来描绘织物整体热导率与单根纤维热导率之间的关系。这个模型需要考虑织物的结构(如纤维的排列、空隙大小和分布等)以及纤维和空隙中的空气对热传导的贡献。此外,我们需要根据织物的整体热导率来逆向推算出单根纤维的热导率。解题思路:使用热传导的基础理论,结合题目给出的纤维和空气的热导率,以及

单片机C语言实例:24、红外通讯

一、红外接收原理程序实例1:#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbitLED=P1^0;//用sbit关键字定义LED到P1.0端口,LED是自己任意定义且容易记忆的符号sbitIR_IN=P3^2;/*-------------------------

热文推荐