树和堆的一些概念

对于大量的输入数据,链表的线性访问时间太慢。树是一种简单的数据结构,其大部分操作的运行时间平均为O(logN)。二叉查找树是TreeSet和TreeMap实现的基础。

树可以用几种方式定义。一种方式是递归,一棵树是一些节点的集合。这个集合可以是空集,若不是空集,则树由称作根的节点root已经0个或多个非空子树组成。一棵树是N个节点和
N-1条边的集合。
二叉树:其中每个节点都不能有多于两个的子节点。二叉树的一个性质是一棵平均二叉树的深度要比节点个数N小得多。二叉查找树深度平均值为O(logN),最大为N-1。

二叉查找树:使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有项的值小于X中的项,它的右子树中所有项的值大于X中的项。这意味着该树所有的元素可以用某种一致的方式排序。

AVL树(平衡二叉查找树):该树的深度必须是O(logN),平衡二叉查找树是每个节点的左子树和右子树的高度最多差1的二叉查找树。对于插入之后破坏了平衡,通过旋转调节。(单旋转、双旋转)

伸展树:该树保证了从空树开始连续M次对树的操作最多花费O(MlogN)时间。它基于这样的事实:对于二叉查找树来说,每次操作最坏情形时间O(N)并不坏,只要它相对不常发生就行。(不理解)

堆:是一棵被完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样的树称为完全二叉树。一棵高为h的完全二叉树有2^k到2^(k+1)-1个节点。这意味着完全二叉树的高是logN。
完全二叉树十分有规律,所以它可以一个数组表示而不需要使用链。对于数组中任一位置i上的元素,其左儿子在位置2i上,其右儿子在2i+1中,它的父亲则在位置i/2上。
让操作快速执行的性质是堆序性质。由于我们想要快速找出最小元,因此最小元应该在根上。如果我们考虑子树也应该是一个堆,那么任意节点就应该小于它的所有后裔。
所以在一个堆中,对于每一个节点X,X的父亲中的关键字(值)小于X中的关键字。根据这个堆序性质,我们可以以常数时间得到最小值。
插入我们采用上滤策略。删除我们采用下滤策略。(具体代码实现)

你可能感兴趣的:(数据结构与算法)