Veiking百草园


老狗啃骨头之数据结构-树和堆

老狗啃骨头   @Veiking   2020-09-29

老狗啃骨头之数据结构-树和堆

摘要:

树在实际应用中非常广泛,较为具体的是,我们用到的Mysql数据库的索引,就是用B+树实现的;很多Hash结构,底层也是用到了红黑树。树是一种功能强大,但相对复杂一些的数据结构,在学习的过程中,可定是要多花些时间精力去深一下,在很多算法的优化上,也可以体会到树这种数据结构在实际运用中带来的乐趣

  树是一种典型的非线性数据结构,是由有限节点组成的一个具有层次关系的集合。
  树这个结构名字起得很形象,可以想象他是一个棵树,从根部开始,发枝散叶,形成一个枝繁叶茂的大树冠:


  实际在我们研究树结构时,一般的习惯是把它倒置过来看,并进一步进行抽象,就像下边的样子:


  这个图上最上边的树根,这个节点,我们一般称之为根节点,向下层层发散,依次连接。相互连接的节点,离根节点层级近的,我们称之为父节点,层级远的,称之为子节点;最终的末梢,我们称之为叶子节点,很形象很形象。
  可以总结,树有以下特点:根节点没有父节点,叶子节点没有子节点;每个非根节点有且只有一个父节点,每个节点有零或多个子节点。此外,在研究树的过程中,每个子节点发散的分支,我们称之为子树,子树之间不会相交
  树这种数据结构,在计算机的应用中非常广泛,在数据结构层面,树结构普遍用于算法的具体实现和优化。
  在树结构的基础上,衍生出很多典型的特异结构,我们说比较典型的是二叉树,像平衡二叉树、红黑树、B-树等,都是由二叉树实现的。
  在普通树的特性之上,二叉树结构具有以下特点:每个节点最多只有两个子节点;每个子节点都有顺序特征,我们称之为左右,左右不可调换。这个左右顺序,要强调下,哪怕是只有一个子节点,也是分左右的,且不可随意变更。

  堆是树结构特性运用的一种特殊形式,它基于的这个逻辑树,且是二叉树,完全二叉树。
  堆对节点值有特殊要求:子节点完全小于等于父节点的,被称为大顶堆;子节点完全大于等于父节点的,被称为小顶堆;反正堆不是大顶堆就是小顶堆,二选其一,如下图:


  堆是特殊二叉树具体应用中的一个归纳,在数据结构层面,我们可以利用堆这个特殊的顺序特点,实现排序算法,如堆排序。
  但从空间结构上,堆也不一定是树,比如这个大顶堆,根据这个完全二叉树的特性,我们就可以用数组结构进行逻辑映射,如下图:


然后我们用公式进行简单定义:大顶堆,即须满足arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
  在计算时,数组这种基于下标的数据结构肯定是比树型数据结构要快的多的多。
  堆的这种应用,既有树结构在算法上的特性,又可以利用数组这种线性结构的便捷快速特性,是一种非常典型的算法优化思路。

总结

  树在实际应用中非常广泛,较为具体的是,我们用到的Mysql数据库的索引,就是用B+树实现的;很多Hash结构,底层也是用到了红黑树。
  树是一种功能强大,但相对复杂一些的数据结构,在学习的过程中,可定是要多花些时间精力去深一下,在很多算法的优化上,也可以体会到树这种数据结构在实际运用中带来的乐趣。
  分享一个魔性争议:链表算不算是一种特殊的树。感兴趣的朋友可以底下跟小伙伴们讨论讨论,哈哈哈。


老狗啃骨头



慷慨发言

(您提供的信息将用于后续必要的反馈联系,本站会恪守隐私)

潜影拾光

老子坐清源

天地不仁,以万物为刍狗。

扫码转发

二维码
二维码
二维码
二维码
二维码
二维码

博文标签