美文网首页
算法复习-查找(4)-二叉排序树

算法复习-查找(4)-二叉排序树

作者: 桔子满地 | 来源:发表于2018-06-25 14:53 被阅读0次

二叉排序树

二叉排序树(BST, binary sort tree)的定义:

  1. 若它的左子树不为空,则左子树上所有关键字的值均小于根关键字的值
  2. 若它的右子树不为空,则右子树上所以关键字的值均大于根关键字的值
  3. 左右子树又各是一颗二叉排序树.

说明:由二叉排序树的定义可以知道,如果输出二叉排序树的中序遍历序列,则这个序列是递增有序的。

二叉排序树的存储结构:
二叉排序树通常采用二叉链表进行存储,其结点类型定义与一般的二叉树类似。

typedef struct TreeNode {
  int key;
  struct BTNode *lchild;
  struct BTNode *rchild;
}BTNode;

二叉排序树的算法

1.查找关键字:

BTNode *BSTSearch(BTNode *bt, int key) {
  if (bt == NULL)
    return NULL;
  else  {
    if (bt->key == key)
      return bt;
    else if (key < bt->key)
      return BSTSearch(bt->lchild, key);
    else
      return BSTSearch(bt->rchild, key);
  }
}

2.插入关键字:

二叉排序树是一个查找表,插入一个关键字首先要找到插入位置。对于一个不存在于二叉排序树中的关键字,其查找不成功的位置即为该关键字的插入位置。

int BSTInsert(BTNode *&bt, int key)//因为插入,bt要改变,所以要用引用型指针
{
  if (bt == NULL)  {
    bt = (BTNode *)malloc(sizeof(BTNode));
    bt->lchild = bt->rchild = NULL;
    bt->key = key;
    return 1;
  }
  else {
    if (bt->key == key)
      return 0;
    else if (bt->key < key)
      return BSTInsert(bt->lchild, key);
    else 
      return BSTInsert(bt->rchild, key);
  }
}

说明:在二叉排序树中插入的关键字均存储在新创建的叶子上,由于找到的插入位置总是在空指针域上,因此在空指针域上连接的一个新结点必为叶子结点。

3.二叉排序树的构造算法:

二叉排序树的构造只需要建立一棵空树,然后将关键字逐个插入到空树中即可构造一棵二叉排序树。

void CreateBST(BTNode *&bt, int key[ ], int n) {
  int i;
  bt = NULL;
  for (i = 0; i < n; ++i)
    BSTInsert(bt, key[i]);
}

4.删除关键字的操作:

假设二叉排序树上被删除结点为p,f为其双亲结点,则删除结点p的过程分为以下3种情况。

  1. p结点为叶子结点,可直接删除
  2. p结点只有左子树没有右子树,或是只有右子树没有左子树。此时只需要将p删除,将原本的指针指向其仅有的左子树或者右子树即可。
  3. 假设p结点既有左子树又有右子树。此时可以将这种情况转化为1)或者2)中的情况,做法为:先沿着p的左子树根结点的右指针一直往右走,直到来到其右子树的最右边一个结点r(也可以沿着p的右子树根结点的左指针一直往左走,直到来到其左子树的最左边的一个结点)。然后将p中的关键字用r中的关键字代替。最后判断,如果r是叶子结点,则按照1)中的方法删除r;如果r是非叶子结点,则按照2)中的方法删除r(此时的r不可能是有两个子树的结点)。

相关文章

  • 2.4.2 查找和排序

    排序 复习1:冒泡排序 复习2:快速排序 查找 1)顺序查找2)二分查找 3)哈希表查找4)二叉排序树查找

  • 算法复习-查找(4)-二叉排序树

    二叉排序树 二叉排序树(BST, binary sort tree)的定义: 若它的左子树不为空,则左子树上所有关...

  • 查找

    静态查找顺序查找 折半查找 散列查找 动态查找二叉排序树 散列查找 ASL(平均查找长度) - 衡量查找算法效率的...

  • 算法和数据结构(一)—— 查找和排序

    查找和排序都是程序设计中经常用到的算法。查找相对而言较为简单,不外乎顺序查找、二分查找、哈希表查找和二叉排序树查找...

  • 查找

    二分查找适用于有序表查找, 包括二叉排序树 散列查找请看本博客数据结构与算法hash表文章http://www.j...

  • 数据结构——查找算法的实现与分析(二叉排序树)

    实验目的: 1.掌握二叉排序树的创建及查找算法(递归和非递归均可)。 实验要求: 1、创建一棵二叉排序树,并实现对...

  • 数据结构题目59:二叉排序树的查找

    题目:二叉排序树的查找。解题思路:其查找过程是:若二叉排序树为空,则查找失败,结束查找,返回信息null;否则,将...

  • Binary Search Tree

    如果二叉排序树是平衡的,则n个节点的二叉排序树的高度为 ,其查找效率为 ,近似于折半查找。如果二叉排序树完全不平衡...

  • 数据结构--查找

    查找分类 有序查找(二分查找、插值查找、斐波拉契查找) 线性索引查找 二叉排序树 散列表

  • 二叉查找树的查找和插入

    常用的查找算法 倒排索引 次关键码 记录号表 二叉排序树,又称为二叉查找数,它或者是一棵空树,或者是具有下列性质的...

网友评论

      本文标题:算法复习-查找(4)-二叉排序树

      本文链接:https://www.haomeiwen.com/subject/dgbkyftx.html