首先, 先明确 “结点 x 的 successor” 的概念。 这句话的概念是, successor 是整个二叉树中, key 仅比 x 的 key 大的结点。
求证: 若 x 有两个孩子, 那么其 successor 没有左孩子。
证明: 若 x 有两个孩子, 则其右子树存在。在二叉树链表中, 对于任意 x 的右子树都是 key 比 x 的 key 大的结点的集合, 即{y|y->key > x->key}。根据 successor 的定义, 若 x->rightChild ≠ nil, 则 successor = Min({y|y->key > x->key})。意味着如果节点 y 是 x 的 successor 且 x 有右孩子, 那么 y 必为 x 的右子树的最左端结点, 所以 y 必然没有左孩子。
对于 Successor() 函数中算法的解释:
1. 若 x 有右孩子, 参见前一证明中的结论。
2. 若 x 没有右孩子, 那么 x 必为以 x 为头结点的子树的 key 最大的结点, 那么若要寻找 successor, 就必须扩大子树的范围, 将 x 的父结点作为新子树的头结点, 记为 p(x)。而 p(x) 存在三种情况:
2.1 若 p(x) = nil, 则搜索结束, 因为这意味着 x 的 key 是整个二叉树中最大的 key, 所以 successor = nil。
2.2 若 p(x) ≠ nil, 且 x 为 p(x) 的左节点,则 successor = p(x)。因为若存在结点 y = successor 且 y ≠ p(x), 则 x->key < y->key < p(x)->key, 根据二叉树链表的规则, y 应满足 y ∈ {y|y->key > x->key} 即 x 的右子树, 但 x 是没有右孩子的。
2.3 若 p(x) ≠ nil, 且 x 为 p(x) 的右节点,则显然 p(x)->key < x->key 即 x 仍为新子树中 key 最大的结点, 所以仍需继续扩大子树的规模, 将当前头结点的父节点作为新子树的头结点进行判断,将其记为 p(y) 则 p(y) 又分为三种情况:
2.3.1 若 p(y) = nil, 则等同于 2.1。
2.3.2 若 p(y) ≠ nil, 且 p(x) 为 p(y) 的右节点,则显然 p(y)->key < p(x)->key < x->key 显然 p(y) 不是 successor, 所以重复 2.3 中的行为继续搜索。
2.3.3 若 p(y) ≠ nil, 且 p(x) 为 p(y) 的左节点,则 p(y) = successor。 因为此时 x = Max({z|z->key <= p(y)->key}) ⇔ p(y) = Min({k|k->key > x->key})联立之前证明中的结论 successor = Min({k|k->key > x->key}) 可得 p(y) = successor。