查找算法之二叉查找树
问题
在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0。
解析
对于这样的有序序列,可以使用二叉查找树的数据结构。二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:
若其左子树存在,则其左子树中每个节点的值都不大于该节点值。
若其右子树存在,则其右子树中每个节点的值都不小于该节点值。
这里以9为例,我们知道前驱一定比9小,那么从根开始。
我们发现根比9大,不满足前驱小于本身的条件,那么根据二叉查找树的性质,我们找他的左子树。
继续找他的左子树。
这回终于碰上一个比9小的了,我们把他记下来,为了确保6是最小的,我们要看他的右子树。
最后发现没有9。结束查找。
以上为BST示意图。
设计
1、如果二叉查找树为空,查找失败,返回0;
2、如果根节点的键等于要查找的键,返回根节点的值。
3、否则,继续在相应的子树中查找。如果要查找的键小于根节点的键,在左子树中查找;如果要查找的键大于根节点的键,在右子树中查找。
4、重复123步骤,直至结束。
分析
假设有一颗二叉排序树,总结点数是n,高度是h,根结点的高度是1,假设是满二叉树, n与h的关系,有公式:n=(2^h)-1,也就是:h=log2(n+1)。所以一次查询最多遍历到树的最深,所以二叉查找树的查询复杂度为O(logn)。