常用的数据结构分别有数组、堆栈、队列、链表、树、图、字典树、哈希表。
上一期的数据结构及其拓展篇数据结构及其拓展篇(一)中,我们讲过了数组(Array)—>集合ArrayList、栈(Stack)—>撤回、队列—>消息队列,那么今天我们就来讲讲链表和树。
一、链表
链表也是线性结构的,看起来和数组相似,但是他们的内存的分配方式、内部的结构以及插入和删除的方式都不一样。
相信大家都知道,数组的查找比较方便,可以直接通过下标查找,但是删除或者插入某些元素就比较麻烦了。链表却与之相反,删除和插入很快,但是查找元素却很慢。那么为了综合这两种的好处,就产生了树,这个我们待会讲。
链表是由一系列的节点组成的链,每一个节点保存了数据以及指向下一个节点的指针。链表头的指针指向下一个节点,如果链表为空,则头指针为空或者为null。链表可以用来实现文件系统、哈希表以及邻接表。链表又分为两种,一种是单向链表,一种是双向链表。链表的基本结构如下图所示: 如上是一个单向链表,Data代表的是数据,Pointer代表的是指针。正式因为链表在查询的时候会频繁地移动指针,所以才影响了它查找地效率。而在删除新增的时候直接改变指针的指向就可以很轻松地实现链表元素地插入删除。像Java中的LinkedList就是双向链表,在IDEA中也是可以看到源码的。
二、树
前面铺垫了那么多,终于要讲到树了,接下来我们一起来看看。
树的种类有很多种,像N叉树、平衡树、二叉树、二叉查找树、平衡二叉树、红黑树、2-3树。 首先看看树的结构元素组成: 如上图,是一个深度为3的树,节点1是没有父节点的节点叫做根节点,节点3是上一层的子节点,下一层的父节点,节点2、4、5、6是没有子节点的叶子节点。
下面我们对各种节点的名词进行一个详细的解读:
节点的度: 一个节点含有的子树的个数称为该节点的度; 如上图:1的度为3。 叶节点: 度为0的节点叫做叶节点,如上图2、4、5、6。 非终端节点或分支节点: 度不为0的节点; 如上图:3为分支节点 双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点。如上图:3是5的父节点。 孩子节点或子节点: 一个节点含有的子树的根节点称为这个节点的子节点; 如上图:5是3的子节点。 兄弟节点: 具有相同父节点的节点互称为兄弟节点; 如上图:2、3、4是兄弟节点。 树的度: 一棵树中,最大的节点的度称为树的度; 如上图:树的度为3。 节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;如上图有三层。 树的高度或深度: 树中节点的最大层次; 如上图:树的高度为3/深度为3。 堂兄弟节点: 双亲在同一层的节点互为堂兄弟;如上图:如果此时4有一个子节点7,那么5、6、7为堂兄弟节点。 节点的祖先: 从根到该节点所经分支上的所有节点;如上图:1是所有节点的祖先。 子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。如上图,所有节点都是1的子孙。 森林: 由m棵互不相交的树的集合称为森林。
树的基本构成元素就是这些了,下一期着重为大家带来经常遇到的二叉树、二叉查找树以及红黑树,这几种树也是你们在面试中经常会被问到的哟。
树讲完以后我们在根据相应的数据结构讲一些基础的算法题练练手吧。
好了,今天的分享先到这里,咱们下期见!
|