什么是二叉搜索树?
二叉查找树 / 二叉搜索树 (Binary Search Tree),有序二叉树(Ordered binary tree)或排序二叉树(Sorted binary tree), 指的是满足特定条件下的二叉树或者一颗空树
满足二叉查找树的条件:
- 若任意节点的左子树不空,则所有的左子树上的节点的值都它的小于根节点的值
- 若任意节点的右子树不空,则所有的右子树的节点的值都大于它的根节点的值
- 任意节点的左右子树也分别为二叉搜索树
二叉搜索树的优势
相对其它数据结构 查找 插入的时间复杂度较低为O(log n)
二叉搜索树的特点
- 中序遍历二叉查找树可以得到一个关键字的有序序列,
- 一个无序序列可以通过构建二叉查找树变成一个有序序列,构建的过程就是对无序序列的过程,每次插入的节点都是二叉查找树的子节点,在插入操作时,不必移动其它节点,只需改动节点指针,由空变成非空即可
- 搜索 删除 插入的复杂度等于树高,期望O(logn), 最坏O(n)(变成线性树)
二叉查找树的查找算法
在二叉查找树b中查找x的过程为:
- 若tree为空,则查找失败
- 若x等于tree的根节点的数据域的值,查找成功
- 若x小于tree的根节点的数据域的值,则继续搜索左子树
- 以上条件都不满足,查找右子树
///二叉查找树 查找过程
BinaryTree *searchBinaryTree(myType x, BinaryTree *tree) {
if (tree == NULL) {
return NULL;
}
if (x < tree -> data) {
///小于节点,去左节点查找
searchBinaryTree(x, tree -> leftChild);
}
else if (x > tree -> data) {
///大于节点,去右节点查找
searchBinaryTree(x, tree -> rightChild);
}
return tree;
}
二叉查找树 查找最小值
///二叉查找树 查找最小值
BinaryTree *searchMin(BinaryTree *tree) {
///遍历左子树 就可以取到最小值
if (tree == NULL) {
return NULL;
}
else if (tree -> leftChild == NULL) {
return tree;
}
else {
return searchMin(tree);
}
}