二叉查找树
二叉查找树(BST:Binary Search Tree)是一种特殊的二叉树,它改善了二叉树节点查找的效率。二叉查找树有以下性质:
(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值
(2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值
(3)左、右子树也分别为二叉排序树
(4)没有键值相等的节点
二叉查找树节点的定义:
1 typedef struct BSTreeNode
2 {
3 int data;
4 struct BSTreeNode *left;//左子树
5 struct BSTreeNode *right;//右子树
6 }BSTree;
跟普通二叉树的节点定义相同
因为查找节点和插入节点都是在已经构建好二叉查找树的前提下才能进行的,在删除节点的时候才涉及到调整二叉树的操作,所以这里先以前序遍历的顺序直接输入一个二叉查找树,代码如下
View Code
1、查找节点(递归实现)
若根结点的关键字等于查找的关键字,查找成功,若小于根结点的关键字的值,递归查找左子树,若大于根结点的关键字的值,递归查找右子树,若子树为空,则查找失败,查找的操作较为简单,实现代码如下
1 /* 查找特定值 */
2 void SearchData(int targ, BSTree *nod)
3 {
4 if (nod != NULL)
5 {
6 if (nod->data == targ)
7 {
8 printf("查找值存在,值为%d\n", nod->data);
9 }
10 else if (nod->data > targ)
11 {
12 SearchData(targ, nod->left); //递归查找左子树
13 }
14 else if (nod->data < targ)
15 {
16 SearchData(targ, nod->right); //递归查找右子树
17 }
18 }
19 else if (nod == NULL)
20 {
21 printf("查找值不存在\n");
22 }
23 }
通过 BST 查找节点,理想情况下我们需要检查的节点数可以减半。如下图中的 BST 树,包含了 15 个节点。从根节点开始执行查找算法,第一次比较决定我们是移向左子树还是右子树,对于任意一种情况,一旦执行这一步,我们需要访问的节点数就减少了一半,从 15 降到了 7。同样,下一步访问的节点也减少了一半,从 7 降到了 3,以此类推,根据这一特点,查找算法的时间复杂度应该是 O(log2n)
对于 BST 查找算法来说,其十分依赖于树中节点的拓扑结构,也就是节点间的布局关系,当 BST 树中的节点以扇形结构散开时,对它的插入、删除和查找操作最优的情况下可以达到亚线性的运行时间 O(log2n),
因为当在 BST 中查找一个节点时,每一步比较操作后都会将节点的数量减少一半。尽管如此,如果拓扑结构像下图中的样子时,运行时间就会退减到线性时间 O(n)。因为每一步比较操作后还是需要逐个比较其余的节点,
也就是说,在这种情况下,在 BST 中查找节点与在数组(Array)中查找就基本类似了。
因此,BST 算法查找时间依赖于树的拓扑结构。最佳情况是 O(log2n),而最坏情况是 O(n)
测试用例:
查找:以前