论文部分内容阅读
二叉树是树型数据结构中最基本也最重要的一种,在计算机学科的众多领域中有着广泛的应用。对于二叉树的枚举的研究,无论在算法理论上还是在实际应用中,都具有重要的意义。 本文首先介绍了现有的四种基于编码的二叉树枚举生成算法,分别是基于树排列的编码生成算法、基于旋转的编码生成算法、广义模式下的编码生成算法、和基于文法的编码生成算法。 堆是一种重要的二叉树,它被广泛应用于数据排序、最短路径、任务调度、最小生成树等与优先级队列相关的领域。所以,对于堆的枚举算法的研究对相关应用领域会有很大的帮助。堆的枚举有两种含义,一种是计数,即计算出具有某种特性的堆的总数目;另一种是生成,即一个一个地产生具有某种特性的所有具体堆。 本文介绍了各种类型的堆的结构及其发展,然后介绍了新近发现的最大值堆的一种性质,以及基于这一性质提出的一种最大值堆的生成算法。这种采用单个数判断法和层次判断法的生成算法避免了生成过程中下层节点的冗余回溯,提高了生成堆的效率。 最后,本文提出一种基于子树生成的堆枚举算法。基于子树生成的算法的思想是将生成一个堆的过程分为:先将堆中最大的节点作为堆的根,然后分别生成根的左子树的一个堆(以下称为左子堆)和根的右子树的一个堆(以下称为右子堆),再将根、左子堆、右子堆组合成一个完整堆的过程。 由于将堆分成左右两个子堆来生成,也就将生成整个堆的过程从生成层数为k(k为整个堆的最大层数)的堆,降低到了生成两个k-1层的堆,可以有效的减少生成整个堆所花费的时间,提高枚举算法的效率。 在基于子树生成的堆枚举算法的基础上,本文进一步提出了多层的子树生成堆的枚举新算法,以及多层子树生成堆的新算法的非递归实现方法。多层子树生成算法是将基于子树生成的算法分别在原有的左右子堆中再次运用,分成更多个更小规模的子堆,进一步提高生成堆的效率。并且,在程序实现过程中可以运用循环的方法来代替递归,减少堆栈所占用的系统开销。 经过C程序的对比实验得出:同文献提到的堆的生成算法相比,多层子树生成算法在嵌套层数为2、堆的节点数n=14~17时可以将枚举生成堆的效率提高80%以上。