zoukankan      html  css  js  c++  java
  • 二叉树链表中一个结论的证明以及 Successor() 函数中算法的解释

    首先, 先明确 “结点 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。

  • 相关阅读:
    创建ASP.NET WEB自定义控件——例程2
    创建ASP.NET WEB自定义控件——例程1
    自己空余時間完成的textbox控件
    创建ASP.NET WEB自定义控件——例程3
    datagrid分頁,排序,跨頁多選。
    ”Bug“一词的来源
    『HTML』Frame框架运用的技术
    JavaScript脚本关闭浏览器窗口不出现提示框小技巧
    『JavaScript』利用Javascript获取IP地址内容方法
    【转】WinForm中实现各窗体之间切换,关闭,打开的操作
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4312062.html
Copyright © 2011-2022 走看看