目录

1、二叉排序树的定义

2、二叉排序树的查找

3、二叉排序树的插入与删除

4、二叉排序树的构造

5、二叉排序树的删除

 

定义

二叉排序树(Binary Sort Tree)又称为二叉查找树(Binary Search Tree)、二叉搜索树。

它是特殊的二叉树:

对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的]。那么,这棵树就是二叉查找树。

 数据结构与算法15—二叉排序(查找)树

 

二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后再就行和每个节点的父节点比较大小,查找最合适的范围。这个算法的效率查找效率很高,但是如果使用这种查找方法要首先创建树。

 

它或者是一颗空树,或者是具有下列性质的二叉树:

  1. 若任意节点的左子树不为空,则左子树上的所有节点的值均小于它的根结点的值;
  2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树。
  4. 没有键值相等的节点。

二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列

构造一颗二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序树这样的非线性结构,也有利于插入和排序的实现。

二叉查找树的高度决定了二叉查找树的查找效率。

 

查找

在二叉查找树中查找x的过程如下:

  1. 若二叉树是空树,则查找失败。
  2. 若x等于根结点的数据,则查找成功,否则。
  3. 若x小于根结点的数据,则递归查找其左子树,否则。
  4. 递归查找其右子树。

复杂度分析,它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。

根据上述的步骤,写出其查找操作的代码:

c语言实现:

 /*二叉树的查找,非递归*/
BiSTNode *BST_Search1(BiSTree t, KeyType kx , BiSTNode **parent)
{  /*在二叉排序树t上查找关键字为kx的元素,若找到,返回所在结点的地址,否则返回空指针,通过形参parent返回待查找结点kx的父结点地址*/
    BiSTNode *p = t, *q = NULL;
    while(p) {  /*从根结点开始查找*/
       if (kx == p->data.key) { /*查找成功*/
            *parent = q;
            return(p);
        }
        q = p;
        if(kx < p->data.key)
            p = p->lchild; /*kx小于p的关键字,在左子树查找*/
        else
            p = p->rchild; /*kx大于p的关键字,在右子树查找*/
    }
    *parent = q;
    return p;   /*查找失败*/
}
View Code

相关文章: