数据结构——树表的查找(二叉排序树)
树表的查找
当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。
改用动态查找表——几种特殊的树
二叉排序树(Binary Sort Tree)
二叉排序树(Binary Sort Tree)又称为二叉搜索树、二叉查找树,
定义:
二叉排序树或是空树,或是满足如下性质的二叉树:
1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;
2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
3)其左右子树本身又各是一棵二叉排序树;
二叉排序树的操作——查找
二叉排序树的存储结构
typedef struct{
KeyType key; //关键字项
InfoType otherinfo; //其他数据域
}ElemType;
typedef struct BSTNode{
ElemType data; //数据域
struct BSTNode *lchild, *rchild; //左右孩子指针
}BSTNode, *BSTree;
BSTree T; //定义二叉排序树T
算法思想:
1)二叉排序树为空,则查找失败,返回空指针
2)若二叉排序树非空,将给定值key与根结点的关键字T
−
-
−>data.key进行比较:
①若key等于T
−
-
−>data.key,则查找成功,返回根结点地址;
②若key小于T
−
-
−>data.key,则进一步查找左子树;
③若key大于T
−
-
−>data.key,则进一步查找右子树。
算法:
BSTree SearchBST(BSTree T, KeyType key){
if((!T) || key == T -> data.key)
return T;
else if(key < T-> data.key)
return SearchBST(T -> lchild, key); //在左子树中继续查找
else return SearchBST(T -> rchild, key); //在右子树中继续查找
}//SarchBST
二叉排序树的查找分析
含有n个结点的二叉排序树的平均查找长度和树的形态有关
二叉排序树的插入
- 若二叉排序树为空,则插入结点作为根结点插入到空树中
- 否则,继续在其左、右子树上查找
- 树中已有,不再插入
- 树中没有
- 查找直至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子结点的左孩子或右孩子
二叉排序树的生成
从空树出发,经过一系列的查找、插入操作之后,可生成一颗二叉排序树
一个 无序序列可通过构造二叉树而变成一个有序序列,构造树的过程就是对无序序列进行排序的过程
二叉排序树的删除
从二叉排序树中删除一个结点,不能把以该结点为根的子树都删除,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变
由于中序遍历二叉排序树可以得到一个递增有序的序列。那么,在二叉排序树中删除一个结点相当于删去有序序列中的一个结点
- 将因删除结点而断开的二叉链表重新链接起来
- 防止重新链接后树的高度增加
其双亲结点中相应指针域的值改为“空”
其双亲结点的相应指针域的值改为“指向被删除结点的左子树或右子树”
将其中序前趋替换,然后再删除该前趋结点;前趋是左子树中最大的结点
也可以用其后继替换之,然后再删除该后继结点;后继是右子树中最小的结点