二叉树T中如何利用属性p, left, right存放指向父节点、左孩子和右孩子的指针。如果x.p = NIL,则x是根节点。如果x没有左孩子,
则x.left = NIL,如果x没有右孩子,则x.right = NIL。属性T.root指向整棵树T的根节点。如果T.root = NIL,则该树为空。
分支无限制的有根树
二叉树的定义方法可以推广到每个节点的孩子数至多为常数k的任意类型的树;只需要将left和right换成child1,..., childk。
但当k的值无限制时,这种表示方法失效。假设k被限制在某个常数范围内,但多数节点的只有少数的孩子,则会浪费大量的内存。使用
左孩子右兄弟表示法,每个节点包含一个父节点指针p,且T.root指向树T的根节点。每个节点中只有两个指针,
x.left-child指向x最最左侧的孩子节点;x.right-sliding指向x右侧的相邻的兄弟节点。如果x没有孩子节点,则x.left-size = NIL,
如果x是其父节点最右孩子,则x.right-sliding = NIL。
散列表--
实现字典操作,元素的关键字、下标记过对关键字计算得来;
直接寻址法:
表示方式:数组T[0..m-1]
前提条件:关键字的范围U{0...m},m不是很大的一个数值。
散列表:
解决直接寻址方式的缺陷:全域U很大,实际存储的关键字集合K相对U较小,导致分配给T的空间的浪费。
在直接寻址方式下,关键字k的元素被存放在槽k中;在散列方式下,该元素存放在槽h(k)中,即利用
散列函数h,由关键字k计算出槽的位置。通过h缩小数组下标的范围,由[U]减小为m;在h的过程中,可能导致两个
k映射到同一个槽中,这种情况称为冲突,解决冲突的办法是链接法和开发寻址
算法导论--树和散列表
最新推荐文章于 2021-05-18 15:00:37 发布