目录
1、二叉排序树的定义
2、二叉排序树的查找
3、二叉排序树的插入与删除
4、二叉排序树的构造
5、二叉排序树的删除
定义
二叉排序树(Binary Sort Tree)又称为二叉查找树(Binary Search Tree)、二叉搜索树。
它是特殊的二叉树:
对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的]。那么,这棵树就是二叉查找树。
二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后再就行和每个节点的父节点比较大小,查找最合适的范围。这个算法的效率查找效率很高,但是如果使用这种查找方法要首先创建树。
它或者是一颗空树,或者是具有下列性质的二叉树:
- 若任意节点的左子树不为空,则左子树上的所有节点的值均小于它的根结点的值;
- 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点。
二叉查找树的性质:对二叉查找树进行中序遍历,即可得到有序的数列。
构造一颗二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序树这样的非线性结构,也有利于插入和排序的实现。
二叉查找树的高度决定了二叉查找树的查找效率。
查找
在二叉查找树中查找x的过程如下:
- 若二叉树是空树,则查找失败。
- 若x等于根结点的数据,则查找成功,否则。
- 若x小于根结点的数据,则递归查找其左子树,否则。
- 递归查找其右子树。
复杂度分析,它和二分查找一样,插入和查找的时间复杂度均为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; /*查找失败*/ }