【笔记】
二项树:
二项树Bk是一种递归定义的有序树。二项树B0只包含一个结点。二项树Bk由两棵二项树Bk-1连接而成:其中一棵树是另一棵树的根的最左孩子。
二项树Bk有以下性质:
1) 共有2^k个结点
2) 树的高度为k
3) 在深度i处恰有C_k^i个结点,其中i=0,1,2,...,k
4) 根的度数为k,它大于任何其它结点的度数;并且,如果根的子女从左到右编号为k-1,k-2,...,0,子女i是子树Bi的根。
在一棵包含n个结点的二项树中,任意结点的最大度数为lgn。
二项堆:
二项堆由一组满足下面的二项堆性质的二项树组成:
1) H中的每个二项树遵循最小堆性质:结点的关键字大于或等于其父结点的关键字。我们所这种树是最小堆有序的。
2) 对任意非负整数k,在H中至多有一棵二项树的根具有度数k。
每个结点x还包含了指向其父结点的指针p[x],指向其最左孩子的指针child[x],以及指向x的紧右兄弟的指针sibling[x]。
一个二项堆中的各二项树的根被组织成一个链表,我们称之为根表。
【练习】
19.1-1 假设x为一个二项堆中,某棵二项树中的一个结点,并假定sibling[x]!=NIL。如果x不是根,则degree[sibling[x]]与degree[x]相比怎么样?如果x是个根呢?
如果x不是根,则是一个二项树内的某个结点由二项堆性质可知degree[sibling[x]]=degree[x]-1。
如果x是根
19.1-2 如果x是二项堆的某棵二项树的一个非根结点,degree[p[x]]与degree[x]相比怎么样?
degree[p[x]]>degree[x]
19.1-3 如图所示,假设按后序遍历顺序,将二项树Bk中的结点标为二进制形式。考虑深度i处标为l的一个结点x,且设j=k-i。证明:在x的二进制表示中共有j个1。恰包含j个1的二进制k串共有多少?证明x的度数与l的二进制表示中,最右0的右边的1的个数相同。