二叉排序树
二叉排序树是一种特殊的二叉树,其 根结点值域 大于左子树中所有结点的值域且 小于右子树中所有结点的值域。
typedef int ElemType;
typedef struct BSTNode{
ElemType data;
struct BSTNode *lchild;
struct BSTNode *rchild;
}BSTNode, *BSTree;
(1) 所有非空左孩子的结点都小于父结点的值
(2) 所有非空右孩子的结点都大于父结点的值
二叉排序树的左右子树也是二叉排序树
性质
- 中序遍历非空的二叉排序树得到的序列递增有序
二叉排序树的操作-查找
若查找的关键字等于根结点,成功;
否则:若小于根结点,在左子树上查找;若大于根结点,在右子树上查找
在左右子树上重复操作,直至找到。
算法思想
- 若二叉排序树为空,则查找失败,返回空指针
- 若二叉排序树非空,则给定值与根结点的关键子data进行比较:
- 若key = data,则查找成功,返回根结点地址;若 key < data,则进一步查找左子树;若 key > data,则进一步查找右子树
代码描述
BSTree SearchBST(BSTree T,KeyType key){
if((!T)||key == T->data) return T;
else if(key < T->data){
return SearchBST(T->lchild,key);
}
else return SearchBST(T->rchild,key);
}
查找分析
查找某关键字等于给定值结点的过程,其实是走了一条从根到该结点的路径
比较的关键字次数 = 此结点所在层数 (最多不超过树的深度)
平均查找长度 = (1+2+2+3+3+3)/6 = 14/6
二叉排序树的操作-插入
算法思想:
- 若二叉排序树为空,则插入结点作为根结点插入到空树中
- 否则,继续在左、右子树上查找;若树中已有,不再插入
- 若树中没有,查找至某个叶子结点的左子树或右子树为空为止,则插入结点应为该叶子节点的左孩子或右孩子
插入的元素一定在叶结点上
二叉排序树的操作-删除
从二叉排序树中删除一个结点,不能把以该结点为根的子树都删去,只能删掉该结点,并且还应保证删除后所得的二叉树仍然满足二叉排序树的性质不变。
删除叶子结点
直接删去该结点
其双亲结点的相应指针域的值改为”空“
只有左子树或右子树
被删除的结点只有左子树或只有右子树时,用其左子树或右子树替换它(结点替换)
既有左子树又有右子树
- 用其中序的前趋值替换之,然后再删除该前趋结点
前趋结点是左子树中最大的结点
- 也可用其中序的后继值替换之,然后再删除该后继结点
后继是右子树中最小的结点