查找算法之二叉查找树

问题

在一个排好序的数组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)。

源码

https://github.com/Geedhayb/Geed/blob/master/BST.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值