前驱和后继

本文所述为二叉排序树的前驱和后继,如果想了解二叉排序树的概念,可以参考我的博文http://www.cnblogs.com/sage-blog/p/3864640.html

给定一个二叉查找树中的结点,有时候要求找出在中序遍历顺序下它的后继。如果所有的关键字均不同,则某一结X点的后继就是所有(结点值)大于X的结点中最小的那个。

包含两种情况:

情况一:结点X的右子树非空,则X的后继是其右子树中最左的结点

情况二:结点X的右子树为空,设X的后继为Y。则Y是X的最低祖先结点,且Y的左儿子也是X的祖先(X自身也可以看做是X的祖先)

 BT* TreeSuccessor(BT* T)
{
BT* S;
if(!T) return NULL;
if(T->right)
{
for(S=N->right;S->left;S=S->left);
return S;
}
for(S=T;S->parent&&(S->parent->right==S);S=S->parent);
return S->parent;
}

相应的,中序遍历下某结点X的前驱就是所有(结点值)小于X的结点中最大的那个。也包含两种情况:

情况一:结点X的左子树非空,则X的前驱是其左子树中最右的结点

情况二:结点X的左子树为空,设X的后继为Y。则Y是X的最低祖先结点,且Y的右儿子也是X的祖先(X自身也可以看做是X的祖先)

  BT* TreePredecessor (BT* T)
{
BT * P;
if (!T) return NULL;
if (T->left)
{
for (P = T->left; P->right; P = P->right);
return P;
}
for (P = t; P->parent && (P->parent->left == P); P = P->parent);
return P->parent;
}

这里有一篇很详细的Bloghttp://blog.csdn.net/markcnsc/article/details/8566466

D&F学数据结构系列——前驱和后继的更多相关文章

  1. D&F学数据结构系列——二叉排序树

    二叉排序树(Binary Sort Tree) 定义:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值. 二叉查找树声明: #ifndef _ ...

  2. D&F学数据结构系列——B树(B-树和B+树)介绍

    B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x ...

  3. D&F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

  4. D&F学数据结构系列——AVL树(平衡二叉树)

    AVL树(带有平衡条件的二叉查找树) 定义:一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 为什么要使用AVL树(即为什么要给二叉查找树增加平衡条件),已经在我之前的博文中说到过 ...

  5. D&F学数据结构系列——插入排序

    插入排序(insertion sort) 插入排序由P-1趟(pass)排序组成.对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P-1上的元素为已排序状态.插入排序利用了这样的事实:位置0到位 ...

  6. D&F学数据结构系列——红黑树

    红黑树 定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个结点不是红的就是黑的 2)根结点是黑的 3)每个叶结点是黑的 4)如果一个结点是红的,它的两个儿子都是黑的(即不可能有两个 ...

  7. 重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)

    学习来源:计蒜客 平衡树 1.定义 对于每一个结点.左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们依照1-n的顺序插入到二叉排序树中,那么二叉排序树就 ...

  8. 简学Python第二章__巧学数据结构文件操作

    #cnblogs_post_body h2 { background: linear-gradient(to bottom, #18c0ff 0%,#0c7eff 100%); color: #fff ...

  9. 【JavaScript数据结构系列】07-循环链表CircleLinkedList

    [JavaScript数据结构系列]07-循环链表CircleLinkedList 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识循环链表 首节点与尾节点相连的,就构成循环链表.其 ...

随机推荐

  1. hdu 1008

    题目意思是:给你N个数字  每个数字表示多少层楼  现在要你从0层楼开始坐电梯  一次按顺序走过这些楼层 规则是 上楼6秒 ,下楼4秒,每次到达一个楼层停5秒..... 思路:模拟 代码如下:(要注意 ...

  2. js-提前声明和new操作符理解

    1.提前声明:声明变量后,js会把声明部分提前到作用域前面. var a=1; function aheadOfStatement(){ alert(a); var a=2; } 这段代码结果是und ...

  3. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  4. spring中scope(作用越)理解

    今天总结了一下spring中作用域scope的用法.在spring中作用域通过配置文件形式的用法如下. <bean id="role" class="spring. ...

  5. oracle 11g 添加控制文件

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  6. Node.js 异步模式浅析

    注:此文是node.js实战读后的总结. 在平常的脚本语言中都是同步进行的,比如php,服务器处理多个请求的方法就是并行这些脚本.多任务处理,多线程等等.但是这种处理方式也有一个问题:每一个进程或者线 ...

  7. Jquer的三种初始化方式

    $(document).ready(function(){ alert(200); }); jQuery(function($){ alert(100); }); $(function(){ aler ...

  8. Go中的指针与函数接收器

    Go中使用*号表示指针,但是没有指针算数,不能对其进行加减.同时内存管理都由Go来负责,不需要拖动释放内存. Go中的函数接收者,可以为值类型,也可以是引用类型. 看代码: package main ...

  9. 2 通过JNI混合使用Java和C++ -----> 访问数组

    关于c和cpp实现native方法的一些注释: 1>  在jni.h中首先定义了C的实现方式,然后用内联函数实现了Cpp的实现方式,如下所示: const char* GetStringUTFC ...

  10. ASP运行流程(主要的类笔记)

    个人笔记:参考汤姆大叔的MVC之前那些事系列整理  client端发送页面请求,被IIS的某个进程截获,它根据申请的页面后缀(.aspx)不同,调用不同的页面处理程序(.asp->asp.dll ...