11.1.6 删
除
对删除来说,
我 们 考 虑 包
含 被 删 除 元
素 的 节 点 p
的三种情况:
1) p 是 树
叶 ; 2) p
只 有 一 个 非
空 子 树 ; 3)
p 有两 个 非
空子树。
情 况 1) 可
以 用 丢 弃 树
叶 节 点 的 方
法 来 处 理 。
要 删 除 图
11-3b 所 示
树 中 的 3
5 , 只 要 把
其父节点的左孩子域置为零,然后删除该节点即可,删除后结果如图 11-3a 所
示。要从树中删除 8 0,只要把节点 4 0 的右孩子域置为零并丢弃节点 8 0,其
结果如图 11-1b 所示。
接下来考察情况 2 )。如果 p 没有父节点(即 p 是根节点),则将 p 丢弃,p
的唯一子树的根节点成为新的搜索树的根节点。如果 p 有父节点 p p,则修改
pp 的指针,使得 pp 指向 p 的唯一孩子,然后删除节点 p。例如,如果希望从
图 11-3b 的树中删除关键值为 5 的元素,则修改该元素父节点的左孩子域,使
其指向关键值为 2 的节点。
最后,要删除一个左右子树都不为空的节点中的元素,只需将该元素替换为它
的左子树中的最大元素或右子树中的最小元素。
4 画出对下列存储于数组中的值执行 buildheap 后得到的最大值堆:
(8 分)
第 3 页 共 11 页