二叉搜索树之前驱后继

转载 2018年04月17日 15:52:17

什么是二叉搜索树

想必对二叉树都有了解,那么什么是二叉搜索树呢? 
首先给出每个节点的属性: 
1)keykey 关键字 
2)pp 父亲节点 
3)leftleft 左孩子 
4)rightright 右孩子 
其定义如下: 
对于任何的节点xx,其左子树的关键字最大不超过x.keyx.key,其右子树的关键字最小不小于x.keyx.key 
下面的所有性质都是围绕该定义展开的。 
方法: 
1)遍历搜索二叉树:同遍历普通二叉树一般,前中后序,随你怎么来。时间复杂度为O(n)O(n)nn为节点数 
2)搜索二叉树:由于二叉树的定义规则,所以搜索的时候如同二分法,时间复杂度为O(h)O(h)hh为树的高度 
3)搜索树的最大最小关键字:同搜索二叉树类似,依据定义的规则,时间复杂度为O(h)O(h) 
4)插入删除的时间复杂度同样也为O(h)O(h)。插入比较简单,同搜索二叉树,直到出现节点为空,则该节点的位置即为插入位置;删除稍微复杂一些,需要考虑三种情况,不再细说,因为这些不是我想介绍的重点。我重点希望讲的是前驱和后继。

后继和前驱

什么是后继和前驱,如果对数的节点的关键字排序: 
key1<=key2<=......<=keyn3<=keyn2<=keyn1<=keynkey1<=key2<=......<=keyn−3<=keyn−2<=keyn−1<=keyn,那么keyn3keyn−3keyn1keyn−1就是keyn2keyn−2的前驱和后继 
后继 
寻找节点的后继被分为两种情况,分别是1)该节点的右子树非空;2)改节点的右子树为空。下面分别解释这两种情况 
1)右子树RR非空。这种情况下的寻找后继相对简单。对搜索二叉树的定义的了解可知,如果通过钟旭遍历二叉树,那么输出的关键字正好是从小到大排序。即遍历该节点之后应该要遍历该节点的右子树,而右子树非空,说明该节点的后继必定在该右子树中,且是右子树的关键字最小的节点,关键字最小的节点可以通过方法3)计算得到。 
2)右子树RR为空。该问题也就是访问完该节点aa,接下来该访问哪一个节点了呢?首先可以肯定的是,接下来要访问的节点是一个根节点。为什么呢?因为我们必须承认,除了根节点以外,任何节点都是某个节点的子树中的一部分。而对于右子树为空的情况,当访问完该节点aa后,以该节点作为根节点的树ZZ访问结束了。接下来可以分两种情况分析,该树ZZ为上一级节点的左子树,显而易见,访问完左子树ZZ就该访问该子树的根节点ee了。那么该根节点就是该节点aa的后继。若该子树为上一级节点的右子树ZZ,那么说明是访问完该根节点ee后再访问右子树的。所以其后继应该还在更上层的节点,直到遇到该节点所在的子树是某个节点qq的左子树的一部分为止。节点qq就是该节点的后继。 
前驱 
前驱和后继对称,不在赘述。 
1)如果节点的左子树非空,那么该节点的前驱就是左子树的最右边的节点(最大节点) 
2)如果节点的左子树为空,那么就以该节点不断回到其双亲节点,知道找到某个节点为其双亲节点的右节点 
则该双亲节点即为后继

求二叉搜索树任一节点的前驱后继节点

二叉搜索树节点的前驱后继节点之前写过文章介绍了二叉搜索树以及其上的基本操作,但不包括求节点的前驱结点和后继节点。这是一个很老的问题了,首先看下某节点前驱和后继节点的定义。一个节点的 前驱结点:节点v...
  • zhaoyunfullmetal
  • zhaoyunfullmetal
  • 2015-08-27 20:55:58
  • 5628

[数据结构] 二叉搜索树 前驱和后继的经验总结

前言最近在看算法导论关于二叉搜索树的相关章节,关于其前驱和后继的小节,我想了好久,总结出了一点经验,想分享给大家,也是怕过一段时间自己忘记了,因此记录在此。后继假设x为当前节点 y为x的后继结点 总...
  • weixin_36210698
  • weixin_36210698
  • 2017-05-08 14:35:30
  • 677

二叉查找树后继节点和前驱节点查找

二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质: 设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树...
  • zldeng_scir
  • zldeng_scir
  • 2011-08-08 16:39:00
  • 4271

继续二叉树之旅,没错,这次是二叉树之————前驱后继

二叉查找树的前驱后继结点: 首先得说明一下什么是前驱?什么是后继 前驱结点:结点值value小于查找结点值search_value的集合中最大值的结点 后继结点:结点值value大于...
  • I_love_blog
  • I_love_blog
  • 2017-03-04 20:35:30
  • 464

算法导论第12章 二叉查找树中的后继

所谓结点x的后继,就是具有大于key[x]中的关键字最小者的那个结点。
  • Miss_Easy
  • Miss_Easy
  • 2014-08-06 11:31:55
  • 423

关于二叉查找树中的某个节点的前趋和后继的算法(Python实现)

废话不多说,代码如下:# -*- coding:utf-8 -*- def Tree_Predecessor(x): '''给定一个二叉查找树的节点z,要求找出在中序遍历下它的前趋''' ...
  • bojdoog
  • bojdoog
  • 2016-03-10 22:06:25
  • 346

二叉树的遍历 插入 查找 删除 最大值 最小值 前驱 后继节点的查找

#include #include using namespace std; //binery search-tree ADT struct treeNode { int value; tree...
  • hero_zouzongling
  • hero_zouzongling
  • 2015-04-29 21:57:44
  • 606

二叉树的前驱和后继

前提二叉树的几何结构和遍历路径,是查找前驱和后继的基础。结点分类几何结构千变万化,但单个结点必然和至多3点邻接:左(或右)父,左子和右子。按照“X”型助记,交叉点为研究对象。为求结点N的前驱结点Pre...
  • liuchaoswu
  • liuchaoswu
  • 2015-05-03 08:56:29
  • 5042

线索二叉树中查找前驱和后继的问题

线索二叉树结点结构定义如下:若结点有左子树,则LChild域仍指向其左孩子; 否则,LChild域指向其某种遍历序列中的直接前驱结点。若结点有右子树,则RChild域仍指向其右孩子; 否则,RChi...
  • ldx19980108
  • ldx19980108
  • 2017-11-12 23:52:20
  • 540

二叉树遍历的前驱和后继规则说明

二叉树遍历的递归算法和非递归算法我们当然应该很熟悉了,不过还有另外一种遍 历方式,就是增加了树的构造,然后不允许递归或是用到栈进行遍历,如线索树或者是 有父母节点的二叉树等等等等。这样的遍历就需要我们...
  • xiaokang06
  • xiaokang06
  • 2014-03-25 19:51:22
  • 4583
收藏助手
不良信息举报
您举报文章:二叉搜索树之前驱后继
举报原因:
原因补充:

(最多只允许输入30个字)