今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树。
我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到这些术语和概念往往会很头疼。头疼也是正常的,因为无端突然出现这么多信息,都不知道它们是怎么来的,也不知道这些信息有什么用,自然就会觉得头疼。这也是很多人学习算法热情很高,但是最后又被劝退的原因。
我们先不讲什么叫生成树,怎么生成树,有向图、无向图这些,先简单点,从最基本的内容开始,完整地将这个算法梳理一遍。
树是什么
首先,我们先来看看最简单的数据结构——树。
树是一个很抽象的数据结构,因为它在自然界当中能找到对应的物体。我们在初学的时候,往往都会根据自然界中真实的树来理解这个概念。所以在我们的认知当中,往往树是长这样的:
上面这张图就是自然界中树的抽象,我们很容易理解。但是一般情况下,我们看到的树结构往往不是这样的,而是倒过来的。也就是树根在上,树叶在下。这样设计的原因很简单,没什么特别的道理,只是因为我们在遍历树的时候,往往从树根开始,从树根往叶子节点出发。所以我们倒过来很容易理解一些,我们把上面的树倒过来就成了这样:
上面的两种画法当然都是正确的,但既然树可以正着放,也可以倒过来放,我们自然也可以将它伸展开来放。比如下面这张图,其实也是一棵树,只是我们把它画得不一样而已。
我们可以想象一下,假如有一只无形的大手抓住了树根将它“拎起来”,那么它自然而然就变成了上面的样子。
然后你会发现,如果真的有这样大手,它不管拎起哪个节点,都会得到一棵树。也就是说,如果树根的位置对我们不再重要的话,树其实就等价于上面这样的图。
那么这样的图究竟是什么图呢?它有什么性质呢?所有的图都能看成是树吗?