7. 顺序检索的缺点是查找时间长。假设顺序表中每个记录的查找概率相同,即 P i =1/n ( i=0 , 1 ,…, n-1 ),查找表中第 i 个记录所需的进行的比较次数 C i =n-i+1 。因此,顺序查找算法查找成功时的平均查找长度为: 算法分析: 查找失败时,算法的平均查找长度为: ASL=n+1 查找不成功情形不可忽略时: 平均查找长度=查找成功的 ASL +查找失败的 ASL ASL=(ASL 成功 +ASL 失败 )/2=3(n+1)/4 ASL=
27. 动态保持二叉排序树平衡的方法: ( 1 )插入 ( 2 )调整平衡度 ( 1 )插入:不考虑结点的平衡度,使用在二叉排序树中插入新结点的方法,把结点 k 插入树中,同时置新结点的平衡度为 0 。 ( 2 )调整平衡度:假设 k 0 , k 1 ,…, k m =k 是从根 k 0 到插入点 k 路径上的结点,由于插入了结点 k ,就需要对这条路径上的结点的平衡度进行调整,取失去平衡的最小子树进行调整
28. 下面具体讨论 AVL 树上因插入新结点而导致失去平衡时的调整方法。 为叙述方便,假设在 AVL 树上因插入新结点而失去平衡的最小子树的根结点为 A (即 A 为距离插入结点最近的,平衡因子不是 -1 、 0 和 1 的结点)。失去平衡后的调整操作可依据失去平衡的原因归纳为下列四种情况分别进行。
29. ( 1 ) LL 型平衡旋转:由于在 A 的左孩子的左子树上插入新结点,使 A 的平衡度由 1 增至 2 ,致使以 A 为根的子树失去平衡,如图 9.9 ( a )所示。此时应进行一次顺时针旋转,“提升” B (即 A 的左孩子)为新子树的根结点, A 下降为 B 的右孩子,同时将 B 原来的右子树 Br 调整为 A 的左子树。 图 9.9 (a) A 2 B 1 B L B r A r h h h LL 型 A 0 B 0 B L B r A r h h h
30. ( 2 ) RR 型平衡旋转:由于在 A 的右孩子的右子树上插入新结点,使 A 的平衡度由 -1 变为 -2 ,致使以 A 为根的子树失去平衡,如图 9.9 ( b )所示。此时应进行一次逆时针旋转,“提升” B (即 A 的右孩子)为新子树的根结点, A 下降为 B 的左孩子,同时将 B 原来的左子树 BL 调整为 A 的右子树。 图 9.9 (b) A -2 B -1 B r B L A L h h h RR 型 A 0 B 0 B r A L B L h h h
31. ( 3 ) LR 型平衡旋转:由于在 A 的左孩子的右子树上插入新结点,使 A 的平衡度由 1 变成 2 ,致使以 A 为根的子树失去平衡,如图 9.9 ( c )所示。此时应进行两次旋转操作(先逆时针,后顺时针),即“提升” C (即 A 的左孩子的右孩子)为新子树的根结点; A 下降为 C 的右孩子; B 变为 C 的左孩子; C 原来的左子树 CL 调整为 B 现在的右子树; C 原来的右子树 Cr 调整为 A 现在的左子树 图 9.9 (c) A 2 B -1 A r h B L h LR 型 C C L h-1 C r h-1 1 A -1 B 0 A r h B L h C L h-1 C r h-1 C 0
32. ( 4 ) RL 型平衡旋转:由于在 A 的右孩子的左子树上插入新结点,使 A 的平衡度由 -1 变成 -2 ,致使以 A 为根的子树失去平衡,如图 9.9 ( d )所示。此时应进行两旋转操作(先顺时针,后逆时针),即“提升” C (即 A 的右孩子的左孩子)为新子树的根结点; A 下降 C 的左孩子; B 变为 C 的右孩子; C 原来的左子树 CL 调整为 A 现在的右子树; C 原来的右子树 Cr 调整为 B 现在的左子树。 图 9.9 (d) B -1 A 0 B r h A L h C L h-1 C r h-1 C 0 A -2 B 1 B r h A L h RL 型 C L h-1 C r h-1 C 1
33. 综上所述,在平衡的二叉排序树 t 上插入一个新的数据元素 x 的算法可描述如下: (一)若 AVL 树 t 为空树,则插入一个数据元素为 x 的新结点作为 t 的根结点,树的深度增 1 ; (二)若 x 的关键字和 AVL 树 t 的根结点的关键字相等,则不进行插入; (三)若 x 的关键字小于 AVL 树 t 的根结点的关键字,则将 x 插入在该树的左子树上,并且当插入之后的左子树深度增加 1 时,分别就下列不同情况进行分情形处理: ( 1 )若 AVL 树的根结点的平衡因子为 -1 (右子树的深度大于左子树的深度),则将根结点的平衡因子调整为 0 ,并且树的深度不变;
34. ( 2 )若 AVL 树的根结点的平衡因子为 0 (左、右子树的深度相等),则将根结点的平衡因子调整为 1 ,树的深度同时增 1 ; ( 3 )若 AVL 树的根结点的平衡因子为 1 (左子树的深度大于右子树的深度),则当该树的左子树的根结点的平衡因子为 1 时需进行 LL 型平衡旋转;当该树的左子树的根结点的平衡因子为 -1 时需进行 LR 型平衡旋转。 (四)若 x 的关键字大于 AVL 树 t 的根结点的关键字,则将 x 插入在该树的右子树上,并且当插入之后的右子树深度增加 1 时,需要分别就不同情况进行处理。其处理操作和(三)中所述相对称