接下来我们将会介绍另外一种数据结构——树。二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构。那么为什么要使用树?它有什么优点?

前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。

然后我们介绍了另外一种数据结构——链表,链表的插入和删除很快,我们只需要改变一些引用值就行了,但是查找数据却很慢了,因为不管我们查找什么数据,都需要从链表的第一个数据项开始,遍历到找到所需数据项为止,这个查找也是平均需要比较N/2次。

那么我们就希望一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 诞生了。

一、树的定义

【百度百科】树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。这就是一棵树-------------------—》》》》》》》》》

二、树的基本概念及特点

树的基本概念

树(tree)是包含n(n>=0)个结点的有穷集,其中:

每个元素称为结点(node);
有一个特定的结点被称为根结点或树根(root);
除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。

树的特点:

①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树;

三、树的常用术语

​ ①路径:顺着节点的边从一个节点走到另一个节点,所经过的节点的顺序排列就称为“路径”。
​ ②:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条
​ ③父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;B是D的父节点。
​ ④子节点:一个节点含有的子树的根节点称为该节点的子节点;D是B的子节点。
​ ⑤兄弟节点:具有相同父节点的节点互称为兄弟节点;比如上图的D和E就互称为兄弟节点。
​ ⑥叶节点:没有子节点的节点称为叶节点,也叫叶子节点,比如上图的H、E、F、G都是叶子节点。
​ ⑦子树:每个节点都可以作为子树的根,它和它所有的子节点、子节点的子节点等都包含在子树中。
​ ⑧节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推。
​ ⑨深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0;
​ ⑩高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0;

四、树的分类

类型上来讲

  1. 无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
  2. 有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
  3. 二叉树:每个节点最多含有两个子树的树称为二叉树;
  4. 完全二叉树
  5. 满二叉树
  6. 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;

算法上来讲

二叉查找树(二叉排序树)、平衡二叉树(AVL树)、红黑树、B-树、B+树、字典树(trie树)、后缀树、广义后缀树。

五、树的操作

  1. 创建树
  2. 销毁树
  3. 清空树
  4. 插入结点
  5. 删除结点
  6. 获取结点
  7. 获取根结点
  8. 获取树的结点数
  9. 获取树的高度
  10. 获取树的度
    我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

六、参考资料

https://www.cnblogs.com/ysocean/p/8032642.html
https://www.cnblogs.com/shixiangwan/p/7530015.html
https://blog.csdn.net/wannuoge4766/article/details/83998377

程序员的进阶课-架构师之路(7)-树的概念相关推荐

  1. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  2. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的进阶课-架构师之路(18)-图

    一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...

  4. 程序员的进阶课-架构师之路(5)-队列

    一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...

  5. 程序员的进阶课-架构师之路(4)-栈

    一.栈的定义 [百度百科]栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据 ...

  6. 程序员的进阶课-架构师之路(3)-线性表

    一.线性表的定义 [百度百科]线性表是最基本.最简单.也是最常用的一种数据结构.线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列. 线性表中数据元素之 ...

  7. 程序员的进阶课-架构师之路(2)-数组

    从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组. 在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样 ...

  8. 程序员的进阶课-架构师之路(1)-数据结构与算法简介

    现在市面上的数据结构与算法的教程也都不少,但有两个问题,第一是泛泛而谈,第二是基本都是c语言实现,而java作为第一主流语言,理应有它自己的独到之处.这也是我写这些博客的初衷,我会讲解java实现的数 ...

  9. 二叉树为空意味着二叉树_程序员的进阶课-架构师之路(8)-二叉树

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

最新文章

  1. vue从后台获取新数据后刷新_vue项目中实现定时刷新页面(重新渲染数据实时更新)...
  2. 潜在狄利克雷分配(LDA,Latent Dirichlet Allocation)模型(二)
  3. java中单例设计模式
  4. server.mapPath(.mdb)
  5. PMCAFF | 产品经理十宗罪(冷静反思篇)
  6. 我在STM32单片机上跑神经网络算法
  7. spring mvc学习(55):简单异常处理二
  8. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表
  9. IOS APP 国际化(实现不跟随系统语言,不用重启应用,代码切换stroyboard ,xib ,图片,其他资源)...
  10. php项目导入其他包,将一个外部项目导入Thinkphp环境中
  11. oracle身份证号substr,Oracle substr()与substrb()
  12. oracle get_ddl XSL error 解决方法
  13. Material Design使用集合
  14. SQLite3-轻量级数据库
  15. python培训班出来能找到工作吗-Python培训班出来好找工作吗?
  16. 00x: Django models.Model详解
  17. 晚上改吃水果+牛奶(防止营养不够)
  18. 让一群脑洞清奇的开发者告诉你,AI+产业的N种可能
  19. 9.DNS和DNSmasq服务
  20. 无线网主域名服务器,主域名服务器和网关的关系

热门文章

  1. DB2数据库安全的12条军规
  2. 跨越原理优缺点_请教:单管跨越式和双管式的优缺点
  3. python2 python3共存导致conda报错_Windows运维之Windows10下配置Python2和Python3共存 并用anaconda实现方便的包管理...
  4. golang for range原理(转载)
  5. [Python] 函数lambda(), filter(), map(), reduce()
  6. shell等待特定进程pid退出的方法
  7. 那些用Go实现的分布式事务框架之DTM
  8. 一文看懂PHP如何实现依赖注入
  9. 解决方案:分布式ID生成
  10. Zookeeper的客户端Curator基本使用