当前位置首页 > 百科资料> 正文

二叉排序树查找

2022-07-06 04:19:15 百科资料

二叉排序树(Binary Search Tree)是一种动态树表。 二叉排序树的定义:二叉排序树或者是一棵空树, 或者是一棵具有如下性质的二叉树: ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列。

  • 中文名 二叉排序树查找
  • 外文名 Binary Search Tree
  • 结    构 数据
  • 是一种 动态树表

主题

  二叉排序树查找

内容

  1.二叉排序树的概念:

  二叉排序树是一种动态树表。

  二叉排序树的定义:二叉排序树或者是一棵空树,

  或者是一棵具有如下性质的二叉树:

  ⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值;

  ⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值;

  ⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列。

  2.二叉排序树的插入:

  在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。

  插入过程:若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;

  当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,

  若s->key = t->key,则无须插入,若s->key< t->key,则插入到根的左子树中,

  若s->key> t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,

  如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。

  3. 二叉排序树生成:

  从空的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。

  说明:

  ① 每次插入的新结点都是二叉排序树上新的叶子结点。

  ② 由不同顺序的关键字序列,会得到不同二叉排序树。

  ③ 对于一个任意的关键字序列构造一棵二叉排序树,其实质上对关键字进行排序。

  4.二叉排序树查找的程序实现:

  5. 二叉排序树的删除:

  假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:

  ⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。

  ⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。

  ⑶ 若结点*p的左、右子树均非空,先找到*p的中序前趋结点*s(注意*s是*p的左子树中的最右下的结点,它的右链域为空),然后有两种做法:

  ① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。

  ② 以*p的中序前趋结点*s代替*p(即把*s的数据复制到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。

  6. 删除算法演示 :

  7. 二叉排序树的查找:

  在二叉排序树中进行查找的过程和二分查找类似,也是一个逐步缩小查找范围的过程。若查找成功,则是走了一条从根结点到待查结点的路径;若查找失败,则是走了一条根结点到某个叶子结点的路径。因此,查找过程中和关键字比较的次数不超过树的深度。

  由于含有n个结点的二叉排序树不唯一,形态和深度可能不同。故含有n个结点的二叉排序树的平均查找长度和树的形态有关。

  最好的情况是: 二叉排序树和二叉判定树形态相同。

  最坏的情况是: 二叉排序树为单支树,这时的平均查找长度和顺序查找时相同。

  最坏情况示例

  就平均性能而言,

  二叉排序树上的查找和二分查找相差不大,并且二叉排序树上的插入和删除结点十分方便,无须大量移动结点。

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net