【数据结构】树和二叉树堆(基本概念介绍)

 🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482

​​

目录

 前言

 树的概念

 树的常见名词

树与非树 

二叉树

概念

满二叉树和完全二叉树

二叉树的存储结构

顺序存储

链式存储

堆的性质


 前言

    💬 hello! 各位铁子们大家好哇。

              期末考试结束,时隔半个月,又开始更新啦。
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

 树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。**把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的**。

  • ·有一个特殊的结点,称为根结点,根结点没有前驱结点
  • 除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、...、Tm,其中每一个集合Ti(1<=i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
  • 因此,树是递归定义的。

 树的常见名词

  • 结点的度:一个结点含有的子树的个数称为该结点的度;如上图:A的为6 
  • 叶结点或终端结点:度为0的结点称为叶结点;如上图:B、C、H、I...等结点为叶结点
  • 非终端结点或分支结点:度不为0的结点;如上图:D、E、F、G...等结点为分支结点
  • 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点;如上图:A是B的父结点
  • 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点;如上图:B是A的孩子结点
  • 兄弟结点:具有相同父结点的结点互称为兄弟结点;如上图:B、C是兄弟结点
  • 树的度:一棵树中,最大的结点的度称为树的度;如上图:树的度为6
  • 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推;
  • 树的高度或深度:树中结点的最大层次;如上图:树的高度为4
  • 堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为堂兄弟结点 
  • 结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先
  • 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙
  • 森林:由m(m>0)棵互不相交的树的集合称为森林; 

树与非树 

​ 上图中,前三个都是非树。

二叉树

概念

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 由一个根结点加上两棵别称为左子树和右子树的二叉树组成。 

从上图可以看出:

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

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

  

满二叉树和完全二叉树

1.满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k -1,则它就是满二叉树。 

2.完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满子叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树(前h-1层是满的,最后一层不一定满,但从左到右必须连续)

   

满二叉树总结点数求和过程:

   

我们根据等比数列求和公式 :a1 (1-q^n)/ (1-q)   即可求出。

由结果2^h-1我们也可以得出:假设满二叉树有N个结点,2^h-1=N,则h=log(N+1)


假设完全二叉树高度为h,结点数量的取值范围是:[2^(h-1),2^h-1]

分析:最小值是当最后一层只有一个结点时,最大值就是一个满二叉树。最小值可以先求出前h-1层,然后加1即可,即2^(h-1)-1+1==2^(h-1)

二叉树的存储结构

顺序存储

顺序结构存储是用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一棵二叉树。

链式存储

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


下图是顺序存储: 

父子结点间下标有一个规律:

  • leftchild = parent *2+1  
  • rightchild= parent*2+2
  • parent=(child - 1)/2

堆的性质

  • 堆中某个结点的值总是不大于或不小于其父节点的值
  • 堆总是一棵完全二叉树

  • 小堆要求:任意一个父亲<=孩子
  • 大堆要求:任意一个父亲>=孩子

堆的意义:堆排序 的 时间复杂度:O(N*logN)  

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

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

相关文章

linux TIME_WAIT时间变短

在Linux中&#xff0c;TIME_WAIT状态表示TCP连接已经关闭但还未完全清除的过程。默认情况下&#xff0c;TIME_WAIT状态会持续2分钟&#xff08;120秒&#xff09;以确保网络上没有重复的数据包被传输到错误的目标地址。 要将TIME_WAIT时间设置为更短的值&#xff0c;可以通过修…

2024.1.14每日一题

LeetCode 83.删除排序链表中的重复元素 83. 删除排序链表中的重复元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输…

手把手教你学会接口自动化系列十-将用例写在json中,持久化管理起来上

我们之前写的把url,登录都封装了,但是用例的数据怎么用其他文件管理起来,和代码分离呢?由次,我就行了json进行用例的管理。 从接口的角度我们分析,我们都知道接口请求有以下几方面: url method headers data 由次我将我的用例管理格式设置成下面的 {"url"…

关闭免费版pycharm社区版双击shift时出现的搜索框

Pycharm 在双击 shift 的时候总是弹出搜索框&#xff0c;但作为中国玩家&#xff0c;经常需要双击 shift 循环切换中英文。这就很困恼。 下面就解决这个问题。单独关闭双击shift的功能。 步骤 1.左上角 File -> Settings 2. 如图&#xff0c;输入‘advan’ 找到高级设置&…

基于AidLux的智慧教育版面分析应用

基于AidLux的智慧教育版面分析应用 1. Aidlux平台介绍 融合架构操作系统AidLux,可以为单一ARM设备同时提供Android和Linux运行环境&#xff0c;双系统既能独立使用又能相互通信。 非虚拟机方式实现双系统融合并行 同时拥有两个系统的完整用户体验无需重启即可在两个系统之间…

RibbonGroup 添加QRadioButton

RibbonGroup添加QRadioButton&#xff1a; QRadioButton * pRadio new QRadioButton(tr("Radio")); pRadio->setToolTip(tr("Radio")); groupClipboard->addWidget(pRadio); connect(pRadio, SIGNAL(clicked(…

扩展卡尔曼滤波(Extended Kalman Filter, EKF):理论和应用

扩展卡尔曼滤波&#xff08;Extended Kalman Filter, EKF&#xff09;&#xff1a;理论、公式和应用 引言 卡尔曼滤波是一种广泛应用于估计动态系统状态的技术&#xff0c;但当系统的动态模型或测量模型是非线性的时候&#xff0c;传统的卡尔曼滤波方法就显得无能为力。扩展卡…

Ubuntu中用useradd创建用户后无法用su切换过去

原因&#xff1a; 没有设置密码&#xff0c;没有指定家目录和shell版本&#xff0c;就不能su切换到新用户 解决方法&#xff1a; su - root //切换到root权限 useradd -m -s /bin/bash node1 //-m自动创建home目录&#xff0c;-s指定shell版本 passwd node1 //设置密码 参考链…

springboot(ssm单位考勤系统 oa办公系统Java系统

springboot(ssm单位考勤系统 oa办公系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库工…

【保姆级教程|YOLOv8添加注意力机制】【1】添加SEAttention注意力机制步骤详解、训练及推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

SpringBoot+thymeleaf实战遇到的问题

目录 一、控制台&#xff1a; 二、数据库查询异常&#xff1a; 三、前后端错误校验 四、在serviceImp中需要添加一个eq条件&#xff0c;表示和数据库中的哪个字段进行比较&#xff0c;否则会查出所有数据&#xff0c;导致500 五、使用流转换数据更简洁 六、重复报错&…

动态规划篇-03:打家劫舍

198、打家劫舍 状态转移方程 base case 边界问题就是&#xff1a;走到最后一间房子门口也没抢&#xff0c;那么最终抢到的金额为0 明确状态 “原问题和子问题中会变化的变量” 抢到的金额数就是状态&#xff0c;因为随着在每一件房子门口做选择&#xff0c;抢到的金额数会随…

大模型训练营Day3 基于 InternLM 和 LangChain 搭建你的知识库 作业

本篇记录大模型训练营第三次的作业&#xff0c;属实是拖延症本症患者。 主要步骤前面的安装各种包和依赖如前面作业一样&#xff0c;按照文档操作即可&#xff1a; 再按照文档进行各种克隆&#xff0c;把知识库复制到本地&#xff1a; 复制粘贴操作文档中的构建向量数据库的文…

七:Day08_任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz。 建议&#xff1a; 单体项目架构使用…

基于51单片机的智能热水器设计

需要全部文件请私信关注我&#xff01;&#xff01;&#xff01; 基于51单片机的智能热水器设计 摘要一、绪论1.1 选题背景及意义1.2 完成目标与功能设计 二、硬件系统设计2.1 硬件完成要求2.2 方案选择2.3 电源电路设计2.4 键盘电路2.5 蜂鸣器报警电路2.6 温度检测电路2.7 红…

UR5机械臂控制

1.ros环境安装 快速安装命令&#xff1a;wget http://fishros.com/install -O fishros && . fishros 2.ur驱动安装 虚拟机Ubuntu16.04ros-kinetic控制真实UR5机械臂总结记录ros kinetic控制UR3机械臂 3.ur命令行控制 使用了 URScript 语言来描述机器人的运动指令&…

数学建模.斯皮尔曼相关系数

一、两种定义 二、用matlab计算 三、两种相关系数计算结果的对比 四、取检验值&#xff08;临界值&#xff09;分为两种情况 &#xff08;1&#xff09;小样本查表 &#xff08;2&#xff09;大样本 P值是大于检验值的概率 本文是学习清风网课后的总结&#xff0c;希望对大家有…

1000以内的质数,用python获取放到list1中,1000以内的斐波那契数,用python获取放到list2中,然后两个list画出曲线图

# -*- coding: utf-8 -*- import matplotlib.pyplot as plt # 获取1000以内的质数 def get_primes(n): primes [] for possiblePrime in range(2, n 1): # 假设数是质数 isPrime True for num in range(2, int(possiblePrime ** 0.5) 1): if possiblePrime % num …

自动驾驶车辆运动规划方法综述 - 论文阅读

本文旨在对自己的研究方向做一些记录&#xff0c;方便日后自己回顾。论文里面有关其他方向的讲解读者自行阅读。 参考论文&#xff1a;自动驾驶车辆运动规划方法综述 1 摘要 规划决策模块中的运动规划环节负责生成车辆的局部运动轨迹 &#xff0c;决定车辆行驶质量的决定因素…

RabbitMQ如何保证消息不丢失?

RabbitMQ如何保证消息不丢失&#xff1f; 消息丢失的情况 生产者发送消息未到达交换机生产者发送消息未到达队列MQ宕机&#xff0c;消息丢失消费者服务宕机&#xff0c;消息丢失 生产者确认机制 解决的问题&#xff1a;publisher confirm机制来避免消息发送到MQ过程中消失。…