文章目录

  • 数据结构---树
    • 1.二叉树
    • 2.二叉查找树-BST
    • 3.平衡二叉树-AVL
    • 4.红黑树
    • 5.哈夫曼树
    • 6.B树
    • 7.B+树
    • 8.R树
  • 总结

数据结构—树

本章总结数据结构中一些树的特征和结构。转载自这里

1.二叉树

  • 二叉树:最多有两颗子树的树被称为二叉树。

二叉树又分为斜树满二叉树完全二叉树

  • 斜树:所有节点都只有左子树的二叉树叫做左斜树,所有节点都只有右子树的二叉树叫做右斜树。(本质就是链表)

  • 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上。

  • 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称为完全二叉树。

2.二叉查找树-BST

二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

3.平衡二叉树-AVL

含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵,那就是平衡二叉树,具有以下性质:

  • 要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1
  • 其左右子树也都是平衡二叉树;
  • 二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1

4.红黑树

红黑树也是一种自平衡的二叉查找树。其特点如下:

  • 每个结点要么是红的要么是黑的。(红或黑)
  • 根结点是黑的。 (根黑)
  • 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)
  • 如果一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)
  • 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

其一些最广的用法如下:

  • Java ConcurrentHashMap & TreeMap
  • C++ STL: map & set
  • linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块
  • epoll在内核中的实现,用红黑树管理事件块
  • nginx中,用红黑树管理timer等

5.哈夫曼树

哈夫曼树又称最优二叉树。是一种带权路径长度最短的二叉树,一般可以按下面步骤构建:

  • 将所有左,右子树都为空的作为根节点。
  • 在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
  • 从森林中删除这两棵树,同时把新树加入到森林中。
  • 重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。

6.B树

B树(英语: B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一种自平衡的m阶树,与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。其特点如下:

  • 根结点至少有两个子女。
  • 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
  • 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
  • 所有的叶子结点都位于同一层。
  • 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree:

7.B+树

B+树是一种树数据结构,通常用于关系型数据库(如MySQL)和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

B+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,B+树相对于B树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

8.R树

R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。因为所有节点都在它们的最小外接矩形中,所以跟某个矩形不相交的查询就一定跟这个矩形中的所有节点都不相交。叶子节点上的每个矩形都代表一个对象,节点都是对象的聚合,并且越往上层聚合的对象就越多。也可以把每一层看做是对数据集的近似,叶子节点层是最细粒度的近似,与数据集相似度100%,越往上层越粗糙。

总结

我们知道,实际应用当中,我们经常使用的是查找排序操作,这在我们的各种管理系统、数据库系统、操作系统等当中,十分常用。

下面是一些常见数据结构的优缺点及适用场景:

数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查找,二分查找要求数组的构造一定有序,二分法查找解决了普通数组查找复杂度过高的问题。任何一种数组无法解决的问题就是插入、删除操作比较复杂,因此,在一个增删查改比较频繁的数据结构中,数组不会被优先考虑。

普通链表由于它的结构特点被证明根本不适合进行查找。

哈希表是数组和链表的折中,同时它的设计依赖散列函数的设计,数组不能无限长、链表也不适合查找,所以也适合大规模的查找。

二叉查找树因为可能退化成链表,同样不适合进行查找。

AVL树是为了解决可能退化成链表问题,但是AVL树的旋转过程非常麻烦,因此插入和删除很慢,也就是构建AVL树比较麻烦。

红黑树是平衡二叉树和AVL树的折中,因此是比较合适的。集合类中的Map、关联数组具有较高的查询效率,它们的底层实现就是红黑树。

多路查找树 是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。

B树与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。它的应用是文件系统及部分非关系型数据库索引。

B+树在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。通常用于关系型数据库(如Mysql)和操作系统的文件系统中。

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针, 在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。

R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

Trie树是自然语言处理中最常用的数据结构,很多字符串处理任务都会用到。Trie树本身是一种有限状态自动机,还有很多变体。什么模式匹配、正则表达式,都与这有关。

针对大量数据,如果在内存中作业优先考虑红黑树(map,set之类多为RB-tree实现),如果在硬盘中作业优先考虑B系列树(B+, B, B*)。

数据结构---树(所有类型的树总结)相关推荐

  1. 20172328《程序设计与数据结构》实验二:树

    20172328<程序设计与数据结构>实验二:树 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:201 ...

  2. js遍历树节点下的所有子节点_【数据结构与算法】(3)——树和二叉树

    树 树的基本概念 树是一种非线性的数据结构,样子如图所示: 树的主要特点是树中的数据是分层存储的,每个元素称为树的节点,最顶层有且只有一个元素,称为根节点,其余层可以有任意数量的节点.除了根节点,其余 ...

  3. 数据结构和算法分析:B树 B+树 和B*树的总结

    1. 前言 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B ...

  4. 数据结构(哈夫曼树+KMP)之 数据加密+解密

    数据结构(哈夫曼树+KMP)之 数据加密+解密 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 1 ...

  5. 数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

    算法基础简介 - OI Wiki (oi-wiki.org) 文章目录 1. 数据结构介绍 1.1 什么是数据结构 1.2 数据结构分类 2. 链表.栈.队列:略 3. 哈希表:略 4. 树 4.1 ...

  6. 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!

    『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...

  7. 数据结构课设--用B树实现图书管理系统

    此文章是分享一下上学期数据结构课程的课程设计,我选择的是以B树为数据结构,开发一个图书管理系统,B树的优点在于查询快,增删结点相对于链表或者顺序表效率更好,因此用来存储大量图书信息更加合适.(开发环境 ...

  8. 数据结构与算法学习笔记-树和二叉树

    声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定! 1.树和二叉树的定义 数 ...

  9. 趣学数据结构--第六章:树

    趣学数据结构---->第六章:树 二叉树 线索二叉树 树的应用 二叉树的深度 二叉树的叶子数 二叉树的结点数 三元组创建二叉树 遍历序列还原树 哈夫曼树 二叉树 二叉树的创建(询问创建以及补空创 ...

最新文章

  1. 【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )
  2. forms oracle runtime_Oracle EBS R12 clone 完毕后,登陆到系统,在运行FORMS程序的时候出现FRM-92101...
  3. 基于visual Studio2013解决面试题之0402合并升序链表并去重
  4. 【Qt for Android】OpenGL ES 绘制彩色立方体
  5. jsp管理系统页面模板_jsp+ssh(spring+struts2+hibernate)+mysql实现的高校实验室管理系统...
  6. java高级教程_Java高级教程02
  7. 华为机试——质数因子
  8. Generator 实现
  9. 非root用户安装nginx
  10. windows下MySQL 5.7+ 解压缩版安装配置方法
  11. data-packed volume container - 每天5分钟玩转 Docker 容器技术(43)
  12. 从三级界面直接跳回一级调用方法
  13. dongle 工具 蓝牙_CC2540 USB Dongle 蓝牙抓包分析仪使用教程
  14. 多边形面积的求法(已知每个点的坐标)hdu2036
  15. 检测目标程序ELF bit是32还是64
  16. 详解无刷直流电机的工作原理
  17. 2021年 阿里云商标注册申请的相关详情及分类介绍
  18. android 筛选电影,Movie - 该看什么电影呢?这几个小程序或许能给你一个选择 - Android 应用 - 【最美应用】...
  19. 互联网日报 | 6月10日 星期四 | 腾讯云推出“云签约”解决方案;华为商城上线“鸿蒙智联”页面;“生鲜电商第一股”争夺战打响...
  20. 怎样有效的检索文献?

热门文章

  1. layui table内嵌入select
  2. 为页面嵌入PDF文件—零基础自学网页制作
  3. Jupyter中文版安装
  4. 价目表报价单微信小程序
  5. 产品经理须知:机会成本和沉没成本
  6. 【Python】用 Python 的 scipy 包实现线性规划(LP)
  7. 哈萨比斯恩师:深度学习只能帮助我们解决10%的难题 | 速递
  8. A-LOAM安装与配置
  9. 【渝粤教育】国家开放大学2018年秋季 2777T绿地规划 参考试题
  10. Python爬取设计素材网站,免费使用素材,花钱不存在花钱的