关于树
树是含有|V|个节点|V|−1条边的最小无向连通图。
在计算机中,树随处可在,可说是图论和计算机科学中的重中之重。
理解树的结构,树的思想和树的优异性质对于程序设计大有裨益。
我将由多个方面入手阐述这一优雅的结构。
树作为图的优异性质
- 树的大小是确定的,只需要Θ(|V|)的空间。
- 树是连通的,只需要进行一次搜索就可以完成遍历。
- 当树的根确定了,任意两点间的关系也唯一确定了,也可看做有向图。
- 树的连通子图也是树。
- 当树较均匀时,从根到叶的步数∼Θ(log|V|)
- 树上两两节点之间存在唯一的简单路径。
树可说是一类非常特殊的图,由于其特殊的性质,科学家们创造许多独属于树的算法,方便处理树形结构,也通过树形结构解决了大量算法问题,数据储存问题和程序调用的问题。
树在计算机体系中的作用
在计算机体系中,树的地位是无可替代的。
计算机的核心是计算和储存,而树有效地解决了储存的问题和计算时程序调用的问题。
程序调用与树
计算机中的一个关键就是如何建立程序之间的调用关系。科学家们利用栈的结构很好地处理了这个问题,程序的递归和栈的操作实质上都是建立在树形结构的基础上的。
![]()
实际上栈的push和pop操作与树访问子节点和回到父节点的效果是等价的,栈底到栈顶的元素实际上就是根到当前节点的元素。
递归程序具象化表达之后,我们都称之为递归树,栈和树其实都可以表达程序之间调用的关系。
程序之间调用的关系就是,被调用的程序应当在调用程序完成之前完成,这其实是建立在程序之间的偏序关系。其对应概念为栈之中先入栈的元素出栈之前后入栈的要先出栈,树之中要退到父节点必须先退出子节点。实质上栈和树可以表达程序之间的偏序关系。而选择栈而非树的原因就是程序调用中很多时候不需要退出一个程序的路径的信息,自然无需真的构建一张图,栈可以更高效地做到树做到的事情。
虽然计算机中使用了树作为建立程序调用关系的数据结构,但是实质上当人理解程序调用的时候更多地会需要利用树形结构,因为路径信息可以辅助理解程序的递归调用和了解递归程序的运行方式。
内存管理与树
说到内存就不得不提到与栈并称的堆了。堆是可以持久化管理和储存数据的数据结构。
实际上堆是一颗不用储存边的完全二叉树,可以通过节点间的关系展开。
![]()
通常我们建的都是小根堆,我们保证了父节点比子节点小。由此我们可以推出任何一条从根开始的链都是递增的。由于树是连通的,可以构建从根到任意非根节点的链,所以根小于所有非根节点。
实质上在堆中,我们将x<y的关系直接转化为了x是
y 的前驱。仍然是使用树来维护一个偏序关系的集合,但这其中有一个线性的偏序关系化为立体的树然后简化回归到线性结构的过程。而由于树的优秀性质,我们在对堆进行增删操作的时候只需要O(logn)的时间。
树与算法
树形结构在算法设计中也有着广泛的应用,其关键在于许多算法在设计的过程中采用了分治的思想,使用了递归求解的方法或者需要遍历可行解,这些程序的运行均可用树形结构表达,辅助人们理解。
以排序算法为例,经典的快速排序,归并排序均为递归求解,使用了分治的思想,而堆排序使用的数据结构——堆,在前文已经介绍了其与树的紧密联系。
![]()
快排的递归树
![]()
归并的递归树可以说由树形结构及递归思维方式直接就带给了我们Θ(nlogn)的排序复杂度。
除了排序算法之外,图论,博弈,动态规划的算法设计中也经常能看到树和递归的身影,大多数分治和结果相互依赖的算法均可用树来表达其递归路径和思想。
树与数据结构
树最强大的功能是进行储存查询,为此计算机科学家们创造了诸如红黑树,AVL树,B+树,字典树,堆,并查集等数据结构,它们被广泛地运用于计算机的各个方面。
树能用于设计数据结构大概有以下几个原因:
- 一颗较均匀的树其高度∼Θ(log|V|),查询十分高效
- 树的空间复杂度为Θ(|V|),利于储存
- 树的性质可以一直被维护,能设计出持久化储存管理数据的结构
- 树可以递归定义,其子树也满足定义,便于在增删的时候调整结构以维护树的定义
- 树的扩展性强,通过微调可以适应环境的变化。
- 树能可以展现偏序关系(dfs序)和全序关系(中序)

树是计算机科学中至关重要的数据结构,因其独特的性质在程序设计、内存管理、算法和数据结构中扮演着关键角色。程序调用的树形结构、内存管理中的堆以及各种高效的算法设计如排序,都离不开树的概念。树的分治思想和递归特性有助于理解和解决问题,同时,特定类型的树如红黑树、AVL树等在实际应用中提供了高效的数据储存和查询解决方案。
1367

被折叠的 条评论
为什么被折叠?



